2 %%Creator: dvips(k) 5.96dev Copyright 2007 Radical Eye Software
4 %%CreationDate: Sun Jul 13 14:11:44 2008
7 %%BoundingBox: 0 0 596 842
8 %%DocumentFonts: SFTT1728 SFRM1728 SFRM1200 SFBX1440 SFRM1000
9 %%DocumentPaperSizes: a4
11 %DVIPSWebPage: (www.radicaleye.com)
12 %DVIPSCommandLine: dvips test_04.dvi
13 %DVIPSParameters: dpi=600
14 %DVIPSSource: TeX output 2008.07.13:1411
15 %%BeginProcSet: tex.pro 0 0
17 /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
18 N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
19 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
20 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
21 landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
22 mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
23 matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
24 exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
25 statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
26 N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
27 /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
28 /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
29 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
30 df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
31 definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
32 }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
33 B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
34 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
35 /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
36 setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
37 restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
38 /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
39 }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
40 bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
41 mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
42 SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
43 userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
44 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
45 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
46 /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
47 /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
48 (LaserWriter 16/600)]{A length product length le{A length product exch 0
49 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
50 end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
51 grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
52 imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
53 exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
54 fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
55 delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
56 B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
57 p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
58 rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
61 %%BeginProcSet: pstricks.pro 0 0
62 % $Id: pstricks.pro 34 2008-06-25 17:20:01Z herbert $
64 %% PostScript prologue for pstricks.tex.
65 %% Version 1.05, 2008/06/25
67 %% This program can be redistributed and/or modified under the terms
68 %% of the LaTeX Project Public License Distributed from CTAN archives
69 %% in directory macros/latex/base/lppl.txt.
72 % Define the follwing gs-functions if not known, eg when using distiller
74 systemdict /.setopacityalpha known not {/.setopacityalpha { pop } def } if
75 systemdict /.setblendmode known not {/.setblendmode { pop } def } if
76 systemdict /.setshapealpha known not {/.setshapealpha { pop } def } if
78 /tx@Dict 200 dict def % the main PSTricks dictionary
80 /ADict 25 dict def % The arrow dictionaray
81 /CM { matrix currentmatrix } bind def
82 /SLW /setlinewidth load def
83 /CLW /currentlinewidth load def
84 /CP /currentpoint load def
85 /ED { exch def } bind def
87 /T /translate load def
90 /Sqrt { dup 0 lt { pop 0 } { sqrt } ifelse } def % return 0 for negative arguments
91 /Atan { /atan load stopped { pop pop 0 } if } def % return 0 if atan not known
92 /ATAN1 {neg -1 atan 180 sub } def % atan(x) (only one parameter)
93 /Div { dup 0 eq { pop } { div } ifelse } def % control the division
94 /tan { dup cos abs 1.e-10 lt
95 { pop 1.e10 } % return 1.e10 as infinit
96 { dup sin exch cos div } ifelse % default sin/cos
98 /Tan { dup sin exch cos Div } def % sin(x)/cos(x) x in degrees
99 /Acos {dup dup mul neg 1 add dup 0 lt { % arc cos, returns 0 when negative root
100 pop pop 0 }{ sqrt exch atan} ifelse } def
101 /NET { neg exch neg exch T } def % change coordinate system to the negative one
102 /Pyth { dup mul exch dup mul add sqrt } def % Pythagoras, expects 2 parameter
103 /Pyth2 { % Pythagoras, xA yA xB yB
104 3 -1 roll % xA xB yB yA
106 3 1 roll % yB-yA xA xB
109 /PtoC { 2 copy cos mul 3 1 roll sin mul } def % Polar to Cartesian
110 /Rand { rand 4294967295 div } def % a real random number
111 %----------------- hv added 20050516 ---------------
112 /PiDiv2 1.57079632680 def
113 /Pi 3.14159265359 def
114 /TwoPi 6.28318530718 def
115 /Euler 2.71828182846 def
117 /RadtoDeg { 180 mul Pi div } bind def % convert from radian to degrees
118 /DegtoRad { Pi mul 180 div } bind def % viceversa
119 %----------------- hv end---------------------------
120 /PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } def
123 { /y1 ED /x1 ED /y2 y1 def /x2 x1 def }
124 { /y ED /x ED PathLength@ }
126 { /y y2 def /x x2 def PathLength@ }
127 /pathforall load stopped { pop pop pop pop } if
131 /STP { .996264 dup scale } def % BP/PT scaling
132 /STV { SDict begin normalscale end STP } def %
134 %%-------------- DG begin patch 15 ---------------%%
135 %/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
136 %PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
137 %mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
138 %/y ED x mul /x ED x 0 gt y 0 gt and { [ y x ] 1 a sub y mul } { [ 1 0 ]
139 %0 } ifelse setdash stroke } def
141 dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def PathLength } ifelse
142 /b ED /x1 ED /y1 ED /x ED /y ED
143 /z y x add y1 add x1 add def
144 /Coef b a .5 sub 2 mul y mul sub z Div round
145 z mul a .5 sub 2 mul y mul add b exch Div def
150 x1 0 gt y1 0 gt or x 0 gt or y 0 gt and
151 { [ y x y1 x1 ] 1 a sub y mul }
155 %%-------------- DG end patch 15 ---------------%%
158 /a ED /z ED /y CLW def
169 [ 0 b b z Div round Div dup 0 le { pop 1 } if ]
170 a 0 gt { 0 }{ y 2 div a -2 gt { neg }if } ifelse
171 setdash 1 setlinecap stroke
174 /LineFill { % hv ------------ patch 7 -------------
176 abs /hatchWidthInc ED
179 a 0 dtransform round exch round exch
182 idtransform pop /a ED
183 .25 .25 itransform pathbbox
185 a Div ceiling cvi /x2 ED /y1 ED
186 a Div cvi /x1 ED /y2 y2 y1 sub def
191 /setstrokeadjust known { true setstrokeadjust } if
193 x1 a mul y1 moveto 0 y2 rlineto stroke
195 hatchWidthInc 0 gt { CLW add } if
197 hatchSepInc 0 gt hatchWidthInc 0 gt or {
198 /a a hatchSepInc add def
199 CLW hatchWidthInc add SLW
205 /PenroseFill {% on stack: scaling factor
207 1 exch div round /penroseFactor ED
208 a 0 dtransform round exch round exch
211 idtransform pop /a ED
212 .25 .25 itransform pathbbox
214 a Div ceiling cvi /x2 ED /y1 ED
215 a Div cvi /x1 ED /y2 y2 y1 sub def
219 /setstrokeadjust known { true setstrokeadjust } if
220 /I/S/L/W/G/+/Z/F/E/D[/def/exch/for{E D}/add{s E get mul}
221 { Z -36.2001 1 33 }{25 E S rlineto}{/q Z dup q G E q 1 + G}{Z 2 2}]{cvx def}forall
222 [0 72 1008 {dup sin E cos }F ]1 setlinejoin/s W{/a W{/b I 10{/i I 4{/m I moveto
223 i m +/j I 10{/l Z b m l + G a l G sub s m get div .2 + floor .3 + 25
224 mul j l + S rmoveto}F i L j L stroke }F}F}F}F
229 %gsave abs CLW add /a ED a 0 dtransform round exch round exch
230 %2 copy idtransform exch Atan rotate idtransform pop /a ED .25 .25
231 %% DG/SR modification begin - Dec. 12, 1997 - Patch 2
232 %%itransform translate pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a
233 %itransform pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a
234 %% DG/SR modification end
235 %Div cvi /x1 ED /y2 y2 y1 sub def clip newpath 2 setlinecap systemdict
236 %/setstrokeadjust known { true setstrokeadjust } if x2 x1 sub 1 add { x1
237 %% DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis)
238 %% a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore }
240 %a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore
242 %% DG/SR modification end
245 ADict begin % hold it local, for end see EndArrow
250 3 index sub exch Atan
254 /EndArrow { @mtrx setmatrix CP grestore end } def % end the ADict
261 { 0 h T 1 -1 scale } if
263 0 0 L w h L w neg a neg rlineto
267 /ArrowD { % the sides are drawn as curves (hv 20071211)
272 { 0 h T 1 -1 scale } if % changes the direction
273 % we use y=w/h^2 * x^2 as equation for the control points
274 % for the coordinates the arrow is seen from top to bottom
275 % the bottom (tip) is (0;0)
276 w neg h moveto % lower left of >
277 w 9 div 4 mul neg h 3 div 2 mul
279 0 0 curveto % tip of >
281 w 9 div 4 mul h 3 div 2 mul
282 w h curveto % upper left of >
283 w neg Inset neg rlineto % move to x=0 and inset
289 z -2 div CLW 2 div moveto
295 CLW mul add dup CLW sub 2 div
296 /x ED mul CLW add /y ED /z CLW 2 div def
298 x neg CLW 2 div L x CLW 2 div L x y L stroke
303 CLW mul add dup 2 div
304 /x ED mul /y ED /mtrx CM def
305 0 CLW 2 div T x y mul 0 ne { x y scale } if
307 .85 .5 .35 0 0 0 curveto
308 -.35 0 -.85 .5 -1 1 curveto
309 mtrx setmatrix stroke 0 CLW moveto
312 /SD { 0 360 arc fill } def
314 /EndDot { % DS is the dot size
315 { /z DS def } { /z 0 def } ifelse
316 /b ED 0 z DS SD b { 0 z DS CLW sub SD } if
317 0 DS z add CLW 4 div sub moveto } def
319 /Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
320 /closepath load } /pathforall load stopped { pop pop pop pop CP /moveto
321 load } if ] cvx newpath 3 1 roll T exec } def
324 % aload length 2 div dup dup cvi eq not { exch pop } if /n exch
328 /NArray { % holds the coordinates and on top of stack the showpoints boolean
330 counttomark 2 div dup cvi /n ED
331 n eq not { exch pop } if
332 showpoints { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse
337 { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub def
339 CP 4 2 roll ArrowB L pop pop
344 /a [ 6 -2 roll ] cvx def
346 /arcto load stopped { 5 } { 4 } ifelse { pop } repeat
350 /CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
351 and { pop pop /n n 1 sub def } if } def
352 /Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
353 repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
354 ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
355 moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
356 Lineto pop pop closepath } ifelse } def
362 dup 0 eq { pop } { CLW mul neg
365 /h d a sin Div h add def
366 /w d a cos Div w add def } ifelse
367 mark w 2 div h 2 div w 0 0 h neg w neg 0 0 h w 2 div h 2 div
368 /ArrowA { moveto } def
371 closepath mtrx setmatrix } def
372 % DG modification begin - Jan. 15, 1997
373 %/Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup 0 eq {
374 %pop } { CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2
375 %div dup cos exch sin Div mul sub def } ifelse mark 0 d w neg d 0 h w d 0
376 %d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx
378 /Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup
379 CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2
380 div dup cos exch sin Div mul sub def mark 0 d w neg d 0 h w d 0
381 d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx
382 % DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis)
385 % DG/SR modification end
401 /dx dx0 l1 c exp mul dx1 l0 c exp mul add def
402 /dy dy0 l1 c exp mul dy1 l0 c exp mul add def
403 /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos abs b exp a mul dx dy Pyth Div 2 div def
404 /x2 x l0 dx mul m mul sub def
405 /y2 y l0 dy mul m mul sub def
406 /dx l1 dx mul m mul neg def
407 /dy l1 dy mul m mul neg def
412 c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } ifelse
413 /a a 2 mul 3 div 45 cos b exp div def
419 /BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
420 /NC { CC x1 y1 x2 y2 x y curveto } def
421 /EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
422 /BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
423 /NAC { x2 y2 x y curveto CC x1 y1 } def
424 /EAC { x2 y2 x y ArrowB curveto pop pop } def
428 { n { pop pop } repeat }
429 { BOC /n n 3 sub def n { NC } repeat EOC } ifelse
433 { false NArray n 2 mul 2 roll
434 [ n 2 mul 3 sub 1 roll ] aload
437 { false NArray } ifelse
438 n 4 lt { n { pop pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse
443 { n { pop pop } repeat }
444 { n 3 gt { CheckClosed } if
445 6 copy n 2 mul 6 add 6 roll
446 IC CC x y moveto n { NC } repeat
451 /SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
452 /ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
453 /SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
455 /FontDot { DS 2 mul dup matrix scale matrix concatmatrix exch matrix
456 rotate matrix concatmatrix exch findfont exch makefont setfont } def
457 /Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
458 x1 y1 lineto closepath } def
459 /OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
460 y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
461 exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
462 /b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
463 x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
465 /Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
466 /y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
467 pop pop Rect } { OvalFrame } ifelse } def
471 counttomark 2 div dup cvi /n ED
472 n eq not { exch pop } if
473 n 1 sub neg 3 mod 3 add 3 mod { 0 0 /n n 1 add def } repeat
474 f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse
481 { ArrowA n 4 sub 3 idiv
482 { 6 2 roll 4 2 roll curveto } repeat
483 6 2 roll 4 2 roll ArrowB curveto } ifelse
490 { moveto n 1 sub 3 idiv
491 { 6 2 roll 4 2 roll curveto } repeat
497 Points aload length 2 div cvi /n ED
499 n 1 sub { lineto } repeat
500 CLW 2 div SLW [ 4 4 ] 0 setdash stroke
505 /y0 ED /x0 ED /y1 ED /x1 ED
506 /dx x0 x1 sub 3 div def
507 /dy y0 y1 sub 3 div def
508 x0 dx sub y0 dy add x1 y1 ArrowA
509 x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB
511 /Points [ x1 y1 x0 y0 x0 2 mul x1 sub y1 ] def
518 cvi dup 1 lt { pop 1 } if
520 s div dup 0 eq { pop 1 } if
521 /dy ED s div dup 0 eq { pop 1 } if
522 /dx ED dy div round dy mul
523 /y0 ED dx div round dx mul
524 /x0 ED dy div round cvi
525 /y2 ED dx div round cvi
526 /x2 ED dy div round cvi
527 /y1 ED dx div round cvi
529 /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def
530 /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def
532 /z1 b 4 div CLW 2 div add def
533 % /Helvetica findfont b scalefont setfont
534 /b b .95 mul CLW 2 div add def } if
535 systemdict /setstrokeadjust known
536 { true setstrokeadjust /t { } def }
537 { /t { transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add
538 exch itransform } bind def } ifelse
539 gsave n 0 gt { 1 setlinecap [ 0 dy n div ] dy n div 2 div setdash } { 2 setlinecap } ifelse
541 /f y1 dy mul n 0 gt { dy n div 2 div h mul sub } if def
542 /g y2 dy mul n 0 gt { dy n div 2 div h mul add } if def
543 x2 x1 sub w mul 1 add dup 1000 gt { pop 1000 } if
544 { i dx mul dup y0 moveto
546 { gsave c i a cvs dup stringwidth pop
547 /z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse
548 h 0 gt {b neg}{z1} ifelse
549 rmoveto show grestore } if
557 % DG/SR modification begin - Nov. 7, 1997 - Patch 1
558 %{ 1 setlinecap [ 0 dx n div ] dy n div 2 div setdash }
559 { 1 setlinecap [ 0 dx n div ] dx n div 2 div setdash }
560 % DG/SR modification end
561 { 2 setlinecap } ifelse
563 /f x1 dx mul n 0 gt { dx n div 2 div w mul sub } if def
564 /g x2 dx mul n 0 gt { dx n div 2 div w mul add } if def
565 y2 y1 sub h mul 1 add dup 1000 gt { pop 1000 } if
566 { newpath i dy mul dup x0 exch moveto
567 b 0 gt { gsave c i a cvs dup stringwidth pop
569 w 0 gt {z1 z2 add neg} {z1} ifelse
570 h 0 gt {z1} {b neg} ifelse
571 rmoveto show grestore } if
582 newpath 0 -1000 moveto clip
588 pop pop pop r a e d PtoC y add exch x add
589 exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
593 /Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
595 /ArcAdjust { %%%% Vincent Guirardel
596 % given a target length (targetLength) and an initial angle (angle0) [in the stack],
597 % let M(angle0)=(rx*cos(angle0),ry*sin(angle0))=(x0,y0).
598 % This computes an angle t such that (x0,y0) is at distance
599 % targetLength from the point M(t)=(rx*cos(t),ry*sin(t)).
600 % NOTE: this an absolute angle, it does not have to be added or substracted to angle0
601 % contrary to TvZ's code.
602 % To achieve, this, one iterates the following process: start with some angle t,
603 % compute the point M' at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)].
604 % Now take t' (= new angle) so that (0,0) M(t') and M' are aligned.
606 % Another difference with TvZ's code is that we need d (=add/sub) to be defined.
607 % the value of d = add/sub is used to know on which side we have to move.
608 % It is only used in the initialisation of the angle before the iteration.
610 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
611 % Input stack: 1: target length 2: initial angle
612 % variables used : rx, ry, d (=add/sub)
614 /targetLength ED /angle0 ED
615 /x0 rx angle0 cos mul def
616 /y0 ry angle0 sin mul def
617 % we are looking for an angle t such that (x0,y0) is at distance targetLength
618 % from the point M(t)=(rx*cos(t),ry*sin(t)))
619 %initialisation of angle (using 1st order approx = TvZ's code)
620 targetLength 57.2958 mul
621 angle0 sin rx mul dup mul
622 angle0 cos ry mul dup mul
624 % if initialisation angle is two large (more than 90 degrees) set it to 90 degrees
625 % (if the ellipse is very curved at the point where we draw the arrow, %
626 % the value can be much more than 360 degrees !)
627 % this should avoid going on the wrong side (more than 180 degrees) or go near
628 % a bad attractive point (at 180 degrees)
629 dup 90 ge { pop 90 } if
630 angle0 exch d % add or sub
631 % maximum number of times to iterate the iterative procedure:
632 % iterative procedure: takes an angle t on top of stack, computes a
633 % better angle (and put it on top of stack)
635 % compute distance D between (x0,y0) and M(t)
636 dup cos rx mul x0 sub dup mul exch sin ry mul y0 sub dup mul add sqrt
637 % if D almost equals targetLength, we stop
638 dup targetLength sub abs 1e-5 le { pop exit } if
639 % stack now contains D t
640 % compute the point M(t') at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]:
641 % M(t')= ( (x(t)-x0)*targetLength/d+x0 , (y(t)-y0)*targetLength/d+y0 )
642 exch dup cos rx mul x0 sub exch sin ry mul y0 sub
643 % stack contains: y(t)-y0, x(t)-x0, d
644 2 index Div targetLength mul y0 add ry Div exch
645 2 index Div targetLength mul x0 add rx Div
646 % stack contains x(t')/rx , y(t')/ry , d
647 % now compute t', and remove D from stack
650 % we don't look at what happened... in particular, if targetLength is greater
651 % than the diameter of the ellipse...
652 % the final angle will be around /angle0 + 180. maybe we should treat this pathological case...
653 % after iteration, stack contains an angle t such that M(t) is the tail of the arrow
654 % to give back the result as a an angle relative to angle0 we could add the following line:
655 % angle0 sub 0 exch d
657 % begin bug fix 2006-01-11
658 % we want to adjust the new angle t' by a multiple of 360 so that | t'-angle0 | <= 180
659 %(we don't want to make the ellipse turn more or less than it should)...
660 dup angle0 sub dup abs 180 gt { 180 add 360 div floor 360 mul sub } { pop } ifelse
665 /d ED % is add or sub
666 /b ED % arrow procedure
671 clip % Set clippath far from arrow.
673 0 1 0 0 b % Draw arrow to determine length.
675 % Length of arrow is on top of stack. Next 3 numbers are junk.
677 a1 exch ArcAdjust % Angular position of base of arrow.
680 a2 cos rx mul xOrig add % hv 2007-08-29 x->xOrig
681 a2 sin ry mul yOrig add % hv 2007-08-29 y->yOrig
682 a1 cos rx mul xOrig add %
683 a1 sin ry mul yOrig add %
684 % Now arrow tip coor and base coor are on stack.
685 b pop pop pop pop % Draw arrow, and discard coordinates.
687 % change value of d (test it by looking if `` 1 1 d '' gives 2 or not )
688 1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse
690 % resets original value of d
691 1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse % Adjust angle to give overlap.
693 %%------------------ tvz/DG/hv (2004-05-10) end -------------------%%
695 /Rot { CP CP translate 3 -1 roll neg rotate NET } def
698 tx@Dict /TMatrix known not { /TMatrix { } def /RAngle { 0 } def } if
699 /TMatrix [ TMatrix CM ] cvx def
701 a Rot /RAngle [ RAngle dup a add ] cvx def
704 /RotEnd { /TMatrix [ TMatrix setmatrix ] cvx def /RAngle [ RAngle pop ] cvx def } def
706 /PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
707 /PutBegin { /TMatrix [ TMatrix CM ] cvx def CP 4 2 roll T moveto } def
708 /PutEnd { CP /TMatrix [ TMatrix setmatrix ] cvx def moveto } def
709 /Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
710 abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
711 div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
712 h1 abs h sub dup s mul abs } ifelse } def
713 /UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
714 mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
715 { x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
717 /BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { Visible
718 /IfVisible true def } if } { IfVisible { Invisible /IfVisible false def
720 /InitOL { /OLUnit [ 3000 3000 matrix defaultmatrix dtransform ] cvx def
721 /Visible { CP OLUnit idtransform T moveto } def /Invisible { CP OLUnit
722 neg exch neg exch idtransform T moveto } def /BOL { BeginOL } def
723 /IfVisible true def } def
725 %-----------------------------------------------------------------------------%
730 %%BeginProcSet: pst-algparser.pro 0 0
732 % PostScript prologue for PSTricks algorithm parser
733 % Version 0.01, 2008/01/01
734 % For distribution and copyright, see pstricks.tex. hv@pstricks.de
736 %-----------------------------------------------------------------------------%
737 /AlgParser { tx@AlgToPs begin AlgToPs end } def % Dominique Rodriguez
739 /tx@CoreAnalyzerDict 100 dict def tx@CoreAnalyzerDict begin
741 % PS ANALYZER FOR ALGEBRAIC EXPRESSION V1.12
744 % FS -> F | +FS | -FS
747 % literal->number|var|var[E]|func(params)
749 % number->TOBEFINISHED
751 %% E expression, T term, SF signed factor, F factor, P power
757 %% C->E<condition_operators>E
758 %% STR index -> STR index+lenExpr
759 /AnalyzeCond { AnalyzeExpr ReadCondOp AnalyzeExpr EvalCondOp } def
761 %% analyze Expression List (separator , or | )
762 %% STR index -> STR index+lenExpr
764 %% { NextNonBlankChar pop AnalyzeExpr%%dup Strlen eq { exit } if NextNonBlankChar
765 %% NextNonBlankChar dup 0 eq { pop exit } if
766 %% dup 44 ne 1 index 124 ne and { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse } if
767 %% pop NextNonBlankChar dup 0 eq { exit } if 124 ne { PROBLEMCONTACTBILLOU } if 1 add NextNonBlankChar 0 eq {toto} if } loop
768 %% AnalyzeListOfEPostHook
772 { NextNonBlankChar pop AnalyzeExpr
773 NotFirst { EvalListOfExpr } { /NotFirst true def } ifelse
774 dup Strlen eq { exit } if NextNonBlankChar
775 dup 44 ne 1 index 124 ne and
776 { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse }
778 AnalyzeListOfEPostHook
780 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
782 %% STR index -> STR index+lenExpr
784 AnalyzePreHook AnalyzeTerm IsEndingExpr
785 { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
786 { { RollOp 1 add NextNonBlankChar pop AnalyzeTerm PreEvalHook EvalAddSub IsEndingExpr { pop exit } if } loop }
790 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
794 AnalyzePreHook AnalyzeSignedFactor IsEndingTerm
795 { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
796 { { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor PreEvalHook EvalMulDiv IsEndingTerm { pop exit } if} loop }
800 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
801 %% FS -> F | +FS | -FS
803 /AnalyzeSignedFactor {
804 AnalyzePreHook 2 copy get dup IsUnaryOp
805 { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor EvalUnaryOp }
806 { pop AnalyzeFactor }
807 ifelse AnalyzePostHook
809 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
813 AnalyzePreHook AnalyzePower IsEndingFactor
814 { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse }
815 { { RollOp 1 add NextNonBlankChar pop AnalyzePower PreEvalHook EvalPower IsEndingFactor { pop exit } if} loop }
816 ifelse AnalyzePostHook
818 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
822 %% depending of first char either a number, or a literal
823 2 copy get dup 40 eq%%an open par
824 { pop 1 add NextNonBlankChar pop AnalyzeExpr 1 add NextNonBlankChar pop }
828 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
829 %% STR index STR[index] -> STR index
830 %/AnalyzeLiteral { IsNumber { EvalNumber } { EvalLiteral } ifelse } def
831 /AnalyzeLiteral { dup IsUnaryOp exch IsNumber or { EvalNumber } { EvalLiteral } ifelse } def%%dr 09102006
832 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
835 /IsUnaryOp { dup 43 eq exch 45 eq or } bind def
836 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
837 %% a number can contain only : 0123456789.
839 /IsNumber { dup 48 ge exch dup 57 le 3 -1 roll and exch 46 eq or } bind def
840 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
841 %% STR index -> STR index number
842 %% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)?
843 %% STR index -> STR index' number
845 exch dup 3 -1 roll dup 3 1 roll
847 { 1 add 2 copy dup Strlen eq { pop pop 0 exit } if get dup IsNumber not { exit } if pop } loop
848 dup 101 eq exch 69 eq or
849 %%% there is a "e" or "E" -> read exponant
850 { 1 add 2 copy get dup IsUnaryOp
851 { pop 1 add 2 copy get } if
852 { IsNumber not { exit } if 1 add 2 copy get } loop }
855 3 -1 roll exch 1 index sub getinterval
857 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
858 %% a number can contain only : 0123456789.
860 /IsCondOp { dup 30 eq exch dup 60 ge exch 62 le and or } bind def
861 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
862 %% STR index -> STR index number
863 %% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)?
864 %% STR index -> STR index' number
866 NextNonBlankChar 1 index 4 1 roll
867 { IsCondOp not { exit } if 1 add 2 copy get } loop
869 exch 1 index sub getinterval 3 1 roll
871 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
872 %% a literal can contain only : 0123456789.
875 dup 48 ge exch dup 57 le 3 -1 roll and exch
876 dup 65 ge exch dup 90 le 3 -1 roll and 3 -1 roll or exch
877 dup 97 ge exch 122 le and or } bind def
878 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
879 %% a literal can be of the form [a-zA-Z][a-zA-Z0-9]*\(\((Expression)\)|\(\[Expression\]\)\)?
880 %% STR index -> literal STR index' nextchr
882 exch dup 3 -1 roll dup 3 1 roll
884 { 2 copy dup Strlen eq { pop pop 0 exit } if get dup IsLiteral not { exit } if pop 1 add } loop
885 4 1 roll dup 5 1 roll 3 -1 roll exch 1 index sub getinterval 4 1 roll
887 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
888 %% expr is ended by end of str or a clpar
889 %% STR index -> STR index STR[index] T/F
892 %% if end of str is reached -> end !
894 %% ending chr -> clpar, comma, |, <, >, =, !,
900 exch dup 60 ge exch 62 le and or or or or or}
902 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
903 %% expr is ended by end of str or a +-
904 %% STR index -> STR index STR[index] T/F
905 /IsEndingTerm { IsEndingExpr { true } { dup dup 43 eq exch 45 eq or } ifelse } def
906 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
907 %% expr is ended by end of str or */
908 %% STR index -> STR index STR[index] T/F
909 /IsEndingFactor { IsEndingTerm { true } { dup dup 42 eq exch 47 eq or } ifelse } def
910 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
911 %% expr is ended by end of str or ^
912 %% STR index -> STR index STR[index] T/F
913 /IsEndingPower { IsEndingFactor { true } { dup 94 eq } ifelse } def
914 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
915 %% STR index -> STR index STR[index]
916 /NextNonBlankChar { { dup Strlen eq { 0 exit } if 2 copy get dup neBlkChar { exit } if pop 1 add } loop } bind def
917 /neBlkChar { dup 32 ne exch dup 10 ne exch 9 ne and and } bind def
918 %%%%%%%%%%%%%%%%%%%%%%%%
921 /BRKtrue {/BRK true def} def
922 /BRKStop {BRK {BRKtoto} if } def
923 /BRKEvalStop {BRK exch if } def
924 /BRKBRK2true {BRK {BRK2true} if } def
926 /BRK2true {/BRK2 true def} def
927 /BRK2Stop {BRK2 {BRK2toto} if } def/BRK {false} def
930 %-------------------------------------------------------------------------------%
932 /tx@AlgToPs 12 dict def tx@AlgToPs begin
934 %% algExpr -> PSVector
935 /AlgToPs { tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE pop pop EndingSequence end } def
936 /EndingSequence { ExpressionVector aload length /end cvx exch 1 add array astore } def
937 /InitParser { /ExpressionVector [ /tx@AddMathFunc cvx /begin cvx ] def dup length /Strlen exch def 0 } def
939 /EvalListOfExpr {} def%
941 ReadNumber cvr /ExpressionVector ExpressionVector aload length dup 3 add -1 roll cvx
942 exch 1 add array astore def NextNonBlankChar pop } def
944 /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
945 43 eq { /add } { /sub } ifelse cvx exch 1 add array astore def
948 /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
949 42 eq { /mul } { /div } ifelse cvx exch 1 add array astore def
952 /ExpressionVector ExpressionVector aload length dup 5 add -1 roll
953 pop /exp cvx exch 1 add array astore def
957 dup 40 eq%%% there is an open par -> function call
959 dup (Sum) eq { EvalSum }
960 { dup (IfTE) eq { EvalCond }
961 { dup (Derive) eq { pop EvalDerive }
962 { pop 1 add NextNonBlankChar pop AnalyzeListOfE 2 index TrigoFunc
963 /ExpressionVector ExpressionVector aload length dup 5 add -1 roll cvn cvx
964 exch 1 add array astore def 1 add NextNonBlankChar pop } ifelse } ifelse} ifelse }
965 { /ExpressionVector ExpressionVector aload length dup 6 add -1 roll cvn cvx exch 1 add array astore def
966 dup 91 eq%%% there is an open bracket -> vector element
967 { pop 1 add NextNonBlankChar pop AnalyzeExpr
968 /ExpressionVector ExpressionVector aload length /cvi cvx exch /get cvx exch 2 add array astore def 1 add }
969 { pop NextNonBlankChar pop }
973 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
974 %% the derive function : Derive(n,f(x))
975 %% firstparindex lastparindex ->
977 %% manage the function descripiton
978 1 add ReadNumber 3 1 roll NextNonBlankChar
979 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
980 1 add NextNonBlankChar pop
983 { pop AnalyzeExpr 3 -1 roll pop 1 add }
984 { 1 sub 3 1 roll (x) exch tx@Derive begin DeriveIndexed end 4 -1 roll
985 { (x) tx@Derive begin Derive end } repeat
986 ExpressionVector exch /ExpressionVector [] def
988 /ExpressionVector 1 index 3 add -1 roll aload length dup 3 add -1 roll /l2 exch def /l1 exch def
989 l1 l2 add 1 add l2 neg roll l1 l2 add array astore def 3 -1 roll pop 1 add
990 1 index length /Strlen exch def } ifelse
993 pop 1 add NextNonBlankChar pop
994 %% read the variable name
995 ReadLiteral pop NextNonBlankChar
996 44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if
997 %% read the initial value
998 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
999 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1000 %% read the increment value
1001 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
1002 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1003 %% read the limit value
1004 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll
1005 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1006 /ExpressionVector ExpressionVector aload length dup 7 add -3 roll 0 4 1 roll
1007 5 -1 roll 4 add array astore def
1008 %% keep ExpressionVector for later and create a new one for internal Sum computation
1009 ExpressionVector 3 1 roll /ExpressionVector [ 6 -1 roll cvn /exch cvx /def cvx ] def
1010 1 add NextNonBlankChar pop AnalyzeExpr
1012 /ExpressionVector ExpressionVector aload length 1 add /add cvx exch array astore def
1013 /ExpressionVector 4 -1 roll aload length ExpressionVector cvx /for cvx 3 -1 roll 2 add
1014 array astore def 3 -1 roll pop 1 add
1016 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1017 %% Convert to radians if trigo function call
1020 dup (cos) eq 1 index (sin) eq or exch (tan) eq or
1021 { /ExpressionVector ExpressionVector aload length Pi /div cvx 180 /mul cvx 5 -1 roll 4 add
1026 pop 1 add AnalyzeCond NextNonBlankChar
1027 44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if
1028 ExpressionVector 3 1 roll /ExpressionVector [] def
1029 1 add AnalyzeExpr ExpressionVector 3 1 roll /ExpressionVector [] def
1030 NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if
1032 NextNonBlankChar 41 ne { ANALYZER_ERROR_missing_ending parenthesis_in_IfTE } if
1034 /ExpressionVector 6 -1 roll aload length dup
1035 6 add -1 roll cvx exch dup 4 add -1 roll cvx /ifelse cvx 3 -1 roll 3 add array astore def
1041 dup (=) eq { /eq } {%
1042 dup (<) eq { /lt } {%
1043 dup (>) eq { /gt } {%
1044 dup (>=) eq { /ge } {%
1045 dup (<=) eq { /ge } {%
1046 dup (!=) eq { /ne } { ERROR_non_valid_conditional_operator }
1047 ifelse } ifelse } ifelse } ifelse } ifelse } ifelse
1049 /ExpressionVector ExpressionVector aload length dup 3 add -1 roll exch 1 add array astore def } def
1051 3 -1 roll 45 eq { /ExpressionVector ExpressionVector aload length /neg cvx exch 1 add array astore def } if
1053 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1055 /AnalyzePreHook {} bind def
1056 /PreEvalHook {} bind def
1057 /AnalyzeListOfEPostHook {} bind def
1058 /AnalyzePostHook {} def
1059 /RollOp { 3 1 roll } bind def
1060 end %tx@CoreAnalyzerDict
1062 %--------------------------------------------------------------------%
1064 /tx@Derive 41 dict def tx@Derive begin
1065 %%increase ^^ for each function added
1066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1067 %% algExpr variable -> PSVector
1069 10240 string 3 1 roll 0 3 1 roll
1071 tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE end
1074 /InitParser { dup length /Strlen exch def 0 } def
1075 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1076 %% algExpr variable index -> PSVector
1078 3 1 roll 10240 string 3 1 roll 0 3 1 roll
1080 tx@CoreAnalyzerDict begin InitParser pop 4 -1 roll AnalyzeExpr 4 -2 roll pop pop 4 -2 roll exch pop end
1082 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1085 4 2 roll 2 copy 9 -1 roll dup length 4 1 roll putinterval add AddPipe
1086 2 copy 7 -1 roll dup length 4 1 roll putinterval add
1088 2 copy pop 0 6 2 roll GetIntervalNewStr 5 1 roll 2 copy 0 exch getinterval 6 1 roll } def
1089 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1092 4 -2 roll 4 index (0) eq
1093 { (0) StrConcat 7 -1 roll pop }
1095 { AddSub AddOpPar true } { false } ifelse
1096 3 1 roll 5 index StrConcat 3 -1 roll { AddClPar } if } ifelse
1097 2 copy pop 0 6 2 roll GetIntervalNewStr
1098 7 -2 roll pop pop 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1100 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1102 /EvalNumber { ReadNumber (0) 6 2 roll } def
1103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1107 { pop true }%% du=0 nothing added
1108 { dup length exch 5 index 5 index 3 -1 roll putinterval 4 -1 roll add 3 1 roll false }
1111 { pop { (0) } { 4 -2 roll 2 copy pop 0 6 2 roll GetIntervalNewStr } ifelse }%%dv=0
1113 { 5 -2 roll 7 index 45 eq { AddSub } if false } %%nothing yet added
1114 { 5 -2 roll 7 index 43 eq%%something yet added
1115 { AddAdd false } { AddSub AddOpPar true } ifelse }
1117 3 -1 roll StrConcat 10 -1 roll { AddClPar } if
1118 2 copy pop 0 6 2 roll GetIntervalNewStr }
1120 mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1122 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1124 /EvalMulDiv { 6 index 42 eq {EvalMul} {EvalDiv} ifelse } def
1125 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1128 4 -2 roll 7 index dup (0) eq
1132 { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse
1133 3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if
1136 5 1 roll 5 index (0) eq
1137 { 5 -1 roll not { (0) StrConcat } if }%%dv=0
1138 { 5 -1 roll { AddAdd } if
1140 { 8 index StrConcat }
1141 { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar }
1145 2 copy pop 0 6 2 roll GetIntervalNewStr
1146 mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1148 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1149 %% (u/v)'=(u'*v-u*v')/v^2
1152 4 index (0) eq%%dv=0 -> u'/v
1153 { 7 index (0) eq { (0) StrConcat } { AddOpPar 7 index StrConcat AddClPar AddDiv 5 index StrConcat } ifelse }
1154 { 7 index dup (0) eq
1158 { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse
1159 3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if}%%du!=0
1163 { 8 index StrConcat }
1164 { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar }
1167 2 copy GetIntervalNewStr 3 1 roll pop 0 AddOpPar 3 -1 roll StrConcat AddClPar
1168 AddDiv AddOpPar 5 index StrConcat AddClPar 2 copy (^2) putinterval 2 add }
1170 2 copy pop 0 6 2 roll GetIntervalNewStr
1171 mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1173 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1174 %% str1 index str2 -> str1 index
1175 /StrConcat { dup length 4 2 roll 2 copy 6 -1 roll putinterval 3 -1 roll add } bind def
1176 /GetIntervalNewStr { 0 exch getinterval dup length string copy } bind def
1177 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1178 %% (u^v)'=(u^v)'=u'vu^(v-1)+v'u^(v)ln(u)
1180 4 -2 roll 7 index (0) eq
1181 {%%if du=0 then (u^v)'=v'ln(u)u^v
1183 { (0) StrConcat }%%if dv=0 then (u^v)'=0
1184 { 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if
1185 8 index (e) ne { (ln\() StrConcat 8 index StrConcat (\)*) StrConcat } if
1186 AddOpPar 8 index StrConcat (\)^\() StrConcat 5 index StrConcat AddClPar } ifelse
1190 {%%if dv=0 then (u^v)'=vu'u^(v-1)
1191 5 index dup IsStrNumber
1194 { dup dup (1) eq exch (1.0) eq or
1197 7 index dup (1) ne exch (1.0) ne and%%%dr 09102006 insert du if <> 1
1198 { (*\() StrConcat 7 index StrConcat (\)) StrConcat } if%%%dr 09102006
1199 (*\() StrConcat 8 index StrConcat (\)) StrConcat
1200 5 index dup dup (2) eq exch (2.0) eq or
1201 { pop } { cvr 1 sub 20 string cvs 3 1 roll (^) StrConcat 3 -1 roll StrConcat } ifelse } ifelse } ifelse }
1202 { pop AddOpPar 5 index StrConcat (\)*\() StrConcat 8 index StrConcat (\)^\() StrConcat
1203 5 index StrConcat (-1\)) StrConcat } ifelse
1205 {%%if dv!=0 and du!=0 then (u^v)'=u'vu^(v-1)+v'u^(v)ln(u)
1206 7 index (1) ne { AddOpPar 7 index StrConcat (\)*) StrConcat } if
1207 AddOpPar 5 index StrConcat (\)*\() StrConcat
1208 8 index StrConcat (\)^\() StrConcat
1209 5 index StrConcat (-1\)+\() StrConcat
1210 4 index (1) ne { 4 index StrConcat (\)*\() StrConcat } if
1211 8 index StrConcat (\)^\() StrConcat
1212 5 index StrConcat (\)*ln\() StrConcat
1213 8 index StrConcat AddClPar
1216 2 copy pop 0 6 2 roll GetIntervalNewStr
1217 mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1219 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1220 %% str -> true/false
1223 { dup 48 lt exch dup 57 gt 3 -1 roll or
1227 and and and { pop false } if } forall
1229 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1230 %% literal switch -> func call, vector, variables
1232 ReadLiteral dup 40 eq%%% there is an open par -> function call
1233 { pop (EvalFunc_ ) 9 4 index StrConcat 0 exch getinterval cvn cvx exec }
1234 { dup 91 eq%%% there is an open bracket -> vector element
1235 { ERROR_vector_not_yet_implemented }
1236 { pop EvalVariable }
1240 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1241 %% first last parpos Expr[first:parpos-1] ->
1242 /EvalVariable { 2 index Variable eq { (1) } { (0) } ifelse 4 -1 roll exch 6 2 roll } def
1243 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1246 4 2 roll 4 index (1) ne
1247 { AddOpPar 4 index StrConcat (\)*) StrConcat } if
1248 (Eval ) 4 8 index StrConcat 0 exch getinterval cvn cvx exec
1249 2 copy pop 0 6 2 roll GetIntervalNewStr
1250 mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1252 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1253 %% Func derivative -> Eval<func>
1256 { (cos\() StrConcat 5 index StrConcat AddClPar } if
1257 PostCommonFunc } def
1260 { (\(-sin\() StrConcat 5 index StrConcat (\)\)) StrConcat } if
1261 PostCommonFunc } def
1264 { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/cos\() StrConcat 5 index StrConcat (\)^2) StrConcat } if
1265 PostCommonFunc } def
1268 { (1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1269 PostCommonFunc } def
1272 { (-1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1273 PostCommonFunc } def
1276 { (1/\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1277 PostCommonFunc } def
1280 { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\() StrConcat 5 index StrConcat AddClPar } if
1281 PostCommonFunc } def
1284 { (exp\() StrConcat 5 index StrConcat AddClPar } if
1285 PostCommonFunc } def
1288 { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\(2*sqrt\() StrConcat 5 index StrConcat (\)\)) StrConcat } if
1289 PostCommonFunc } def
1291 PreCommonFunc { ERROR_no_variable_expression_in_Fact } if
1292 PostCommonFunc } def
1295 { (ch\() StrConcat 5 index StrConcat AddClPar } if
1296 PostCommonFunc } def
1299 { (sh\() StrConcat 5 index StrConcat AddClPar } if
1300 PostCommonFunc } def
1303 { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/ch\() StrConcat 5 index StrConcat (\)^2) StrConcat } if
1304 PostCommonFunc } def
1307 { (1/sqrt\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1308 PostCommonFunc } def
1311 { (1/sqrt\(\() StrConcat 5 index StrConcat (\)^2-1\)\)) StrConcat } if
1312 PostCommonFunc } def
1315 { (1/\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if
1316 PostCommonFunc } def
1317 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1319 1 add NextNonBlankChar pop 3 -1 roll 5 1 roll AnalyzeExpr 1 add NextNonBlankChar pop
1320 4 2 roll 4 index (0) eq
1321 { (0) StrConcat false }
1322 { 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if true } ifelse
1325 2 copy pop 0 6 2 roll GetIntervalNewStr
1326 mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1329 1 add ReadNumber cvi 1 add dup cvr log 1 add cvi string cvs
1330 4 -1 roll pop 5 1 roll 1 add NextNonBlankChar pop AnalyzeExpr 1 add
1331 4 -2 roll (Derive\() StrConcat 7 -1 roll StrConcat (,) StrConcat 6 -1 roll StrConcat AddClPar
1332 2 copy pop 0 6 2 roll GetIntervalNewStr 6 -1 roll pop 2 index 6 index dup 4 index exch sub getinterval
1334 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1335 %% literal switch -> func call, vector, variables
1337 1 add NextNonBlankChar pop
1338 %% read the variable name
1339 ReadLiteral pop 3 -1 roll pop NextNonBlankChar
1340 44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if
1341 %% read the initial value
1342 1 add NextNonBlankChar pop ReadNumber pop
1343 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if
1344 %% read the increment value
1345 1 add NextNonBlankChar pop ReadNumber pop
1346 2 copy get 44 ne { ANALYZER_ERROR_missing_third_comma_in_Sum } if
1347 %% read the limit value
1348 1 add NextNonBlankChar pop ReadNumber pop
1349 2 copy get 44 ne { ANALYZER_ERROR_missing_fourth_comma_in_Sum } if
1350 1 add NextNonBlankChar pop dup 6 1 roll 3 -1 roll pop AnalyzeExpr 1 add NextNonBlankChar pop
1351 4 -2 roll 3 index 8 index dup 9 index exch sub getinterval StrConcat
1352 4 index StrConcat AddClPar
1353 2 copy pop 0 6 2 roll GetIntervalNewStr
1354 mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1356 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1357 %% literal switch -> func call, vector, variables
1359 3 -1 roll pop 1 add NextNonBlankChar pop SkipCond
1361 44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if
1362 1 add NextNonBlankChar pop dup 5 1 roll
1363 AnalyzeExpr NextNonBlankChar
1364 44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if
1365 1 add NextNonBlankChar pop
1366 AnalyzeExpr 1 add NextNonBlankChar pop
1367 4 -2 roll 3 index 10 index dup 11 index exch sub getinterval StrConcat
1368 6 index StrConcat (,) StrConcat 4 index StrConcat AddClPar
1369 2 copy pop 0 6 2 roll GetIntervalNewStr
1370 mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll
1372 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1373 %% advance in str until a comma is found (no error detection!)
1374 %% str index -> str index'
1375 /SkipCond { { 1 add 2 copy get 44 eq {exit } if } loop } bind def
1376 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1377 %% Convert to radians if trigo function call
1380 dup (cos) eq 1 index (sin) eq or exch (tan) eq or
1381 { /ExpressionVector ExpressionVector aload length Pi /div cvx 180 /mul cvx 5 -1 roll 4 add
1385 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1386 %% No derivative for condition....
1387 /EvalCondOp { 3 -1 roll pop } bind def
1388 /PutIntervalOneAdd {putinterval 1 add} bind def
1389 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1390 %% Add open parenthesis in string at the given index
1391 %% str index -> str index+1
1392 /AddOpPar {2 copy (\() PutIntervalOneAdd} bind def
1393 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1394 %% Add close parenthesis in string at the given index
1395 %% str index -> str index+1
1396 /AddClPar {2 copy (\)) PutIntervalOneAdd} bind def
1397 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1398 %% Add 0 in string at the given index
1399 %% str index -> str index+1
1400 /AddZero {2 copy (0) PutIntervalOneAdd} bind def
1401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1402 %% Add open parenthesis in string at the given index
1403 %% str index -> str index+1
1404 /AddMul {2 copy (*) PutIntervalOneAdd} bind def
1405 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1406 %% Add open parenthesis in string at the given index
1407 %% str index -> str index+1
1408 /AddDiv {2 copy (/) PutIntervalOneAdd} bind def
1409 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1410 %% Add a plus sign in string at the given index
1411 %% str index -> str index+1
1412 /AddAdd {2 copy (+) PutIntervalOneAdd} bind def
1413 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1414 %% Add a minus sign in string at the given index
1415 %% str index -> str index+1
1416 /AddSub {2 copy (-) PutIntervalOneAdd} bind def
1417 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1418 %% Add a pipe sign in string at the given index
1419 %% str index -> str index+1
1420 /AddPipe {2 copy (|) PutIntervalOneAdd} bind def
1421 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1423 /AnalyzePreHook { dup 5 1 roll } bind def
1425 /AnalyzePostHook { 7 -1 roll pop } bind def
1426 /AnalyzeListOfEPostHook { 6 -1 roll mark 6 1 roll cleartomark } bind def
1427 /RollOp { 5 1 roll } bind def
1428 end%%%tx@CoreAnalyzerDict
1429 /tx@AddMathFunc 12 dict def tx@AddMathFunc begin
1430 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1432 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1433 %% function arcsine in radians asin(x)=atan(x/sqrt(1-x^2))
1436 dup abs 1 gt { EQDFasinrangeerror } if
1437 dup dup dup mul 1 exch sub sqrt atan exch 0 lt { 360 sub } if DegtoRad
1439 %% function arccosine in radians acos(x)=atan(sqrt(1-x^2)/x)
1442 dup abs 1 gt { EQDFacosrangeerror } if
1443 dup dup mul 1 exch sub sqrt exch atan DegtoRad
1445 %% function arctangent in radians
1447 /atg { 1 atan dup 90 gt { 360 sub } if DegtoRad } bind def
1448 %% HYPERBOLIC FUNCTIONS
1449 /sh { dup Ex exch neg Ex sub 2 div } def
1450 /ch { dup Ex exch neg Ex add 2 div } def
1451 /th { dup sh exch ch div } def
1452 /Argsh { dup dup mul 1 add sqrt add ln } def
1453 /Argch { dup dup mul 1 sub sqrt add ln } def
1454 /Argth { dup 1 add exch 1 exch sub div ln 2 div } def
1455 %% modified exponential funtion for 0
1457 /Exp { dup 0 eq { pop pop 1 } { exp } ifelse } bind def
1458 %% modified exponential funtion for 0
1460 /Ex { Euler exch exp } bind def
1462 %% factorial function
1464 /Fact { 1 exch 2 exch 1 exch { mul } for } bind def
1465 /fact { Fact } bind def
1471 %%BeginProcSet: pst-dots.pro 0 0
1472 % $Id: pst-dots.pro 11 2008-01-24 13:37:27Z herbert $
1474 %% PostScript prologue for pstricks.tex.
1475 %% Version 2.01, 2008/04/18
1477 %% For distribution, see pstricks.tex.
1479 %% Timothy Van Zandt <tvz@Princeton.EDU>
1481 %% This program can be redistributed and/or modified under the terms
1482 %% of the LaTeX Project Public License Distributed from CTAN archives
1483 %% in directory macros/latex/base/lppl.txt.
1485 %% Modified by Etienne Riga - Dec. 16, 1999
1486 %% Modified by Etienne Riga - 2005/01/01 (er)
1487 %% to add /Diamond, /SolidDiamond and /BoldDiamond
1488 %% Modified by Herbert Voss (hv) - 2008/04/17
1490 10 dict dup begin % hold local
1492 /FontMatrix [.001 0 0 .001 0 0] def
1493 /FontBBox [-571.5 -742.5 571.5 742.5] def
1494 % /FontBBox [-1000 -1000 1000 1000] def % See end of file in /BuildGlyph
1495 /Encoding 256 array def
1496 0 1 255 {Encoding exch /.notdef put} for % fill the array with /.notdef
1497 Encoding % replace with given dot names
1498 dup (b) 0 get /Bullet put % get the numerical position of b in ASCII
1499 % % and save /Bullet at this place in Encoding
1500 dup (c) 0 get /Circle put
1501 dup (C) 0 get /BoldCircle put % 67
1502 dup (u) 0 get /SolidTriangle put
1503 dup (t) 0 get /Triangle put
1504 dup (T) 0 get /BoldTriangle put
1505 dup (r) 0 get /SolidSquare put
1506 dup (s) 0 get /Square put
1507 dup (S) 0 get /BoldSquare put
1508 dup (q) 0 get /SolidPentagon put
1509 dup (p) 0 get /Pentagon put
1510 dup (P) 0 get /BoldPentagon put
1512 dup (k) 0 get /Asterisk put
1513 dup (K) 0 get /BoldAsterisk put
1514 dup (J) 0 get /SolidAsterisk put
1515 dup (h) 0 get /Hexagon put
1516 dup (H) 0 get /BoldHexagon put
1517 dup (G) 0 get /SolidHexagon put
1518 dup (f) 0 get /Octogon put % 2008-04-18 hv
1519 dup (F) 0 get /BoldOctogon put % 2008-04-18 hv
1520 dup (g) 0 get /SolidOctogon put % 2008-04-18 hv
1521 dup (a) 0 get /Add put
1522 dup (A) 0 get /BoldAdd put % 65
1523 dup (x) 0 get /Mul put
1524 dup (X) 0 get /BoldMul put
1525 dup (m) 0 get /Oplus put
1526 dup (M) 0 get /BOplus put
1527 dup (e) 0 get /SolidOplus put
1528 dup (n) 0 get /Otimes put
1529 dup (N) 0 get /BOtimes put
1530 dup (E) 0 get /SolidOtimes put
1531 dup (i) 0 get /Bar put
1532 dup (I) 0 get /BoldBar put
1533 dup (l) 0 get /SolidDiamond put
1534 dup (d) 0 get /Diamond put
1535 (D) 0 get /BoldDiamond put
1537 /CharProcs 47 dict def
1539 /CirclePath {0 0 500 0 360 arc closepath} def
1540 /Bullet {CirclePath fill} def
1541 /Circle {CirclePath .9 .9 scale CirclePath eofill} def
1542 /BoldCircle {CirclePath .8 .8 scale CirclePath eofill} def
1543 /TrianglePath {0 660 moveto -571.5 -330 lineto 571.5 -330 lineto closepath} def
1544 /SolidTriangle {TrianglePath fill} def
1545 /Triangle {TrianglePath .85 .85 scale TrianglePath eofill} def
1546 /BoldTriangle {TrianglePath .7 .7 scale TrianglePath eofill} def
1547 /SquarePath {-450 450 moveto 450 450 lineto 450 -450 lineto -450 -450 lineto closepath} def
1548 /SolidSquare {SquarePath fill} def
1549 /Square {SquarePath .89 .89 scale SquarePath eofill} def
1550 /BoldSquare {SquarePath .78 .78 scale SquarePath eofill} def
1552 -337.8 -465 moveto 337.8 -465 lineto 546.6 177.6 lineto
1553 0 574.7 lineto -546.6 177.6 lineto closepath
1555 /SolidPentagon {PentagonPath fill} def
1556 /Pentagon {PentagonPath .89 .89 scale PentagonPath eofill} def
1557 /BoldPentagon {PentagonPath .78 .78 scale PentagonPath eofill} def
1558 %-------------- hv begin 2004/07/25 from: er 2003/03/24
1560 0 550 moveto -476 275 lineto -476 -275 lineto
1561 0 -550 lineto 476 -275 lineto 476 275 lineto closepath
1563 /SolidHexagon {HexagonPath fill} def
1564 /Hexagon {HexagonPath .89 .89 scale HexagonPath eofill} def
1565 /BoldHexagon {HexagonPath .79 .79 scale HexagonPath eofill} def
1568 228 550 moveto 7 { -456 0 rlineto 45 rotate } repeat
1571 /SolidOctogon { OctogonPath fill } def
1572 /Octogon { OctogonPath .89 .89 scale OctogonPath eofill } def
1573 /BoldOctogon { OctogonPath .79 .79 scale OctogonPath eofill } def
1576 20 0 moveto 10 250 180 500 0 500 curveto
1577 -180 500 -10 250 -20 0 curveto closepath
1580 AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath
1581 60 rotate AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath fill
1584 /Basterp {50 250 220 500 0 500 curveto -220 500 -50 250 -50 30 cos 100 mul curveto} def
1586 50 30 cos 100 mul moveto Basterp
1587 60 rotate Basterp 60 rotate Basterp
1588 60 rotate Basterp 60 rotate Basterp
1589 60 rotate Basterp closepath
1591 /BoldAsterisk {BoldAsteriskPath fill} def
1592 /SolidAsterisk {CirclePath .9 .9 scale BoldAsteriskPath eofill} def
1594 40 550 moveto -40 550 lineto -40 40 lineto -550 40 lineto
1595 -550 -40 lineto -40 -40 lineto -40 -550 lineto 40 -550 lineto
1596 40 -40 lineto 550 -40 lineto 550 40 lineto 40 40 lineto closepath
1598 /BoldCrossPath {80 550 moveto -80 550 lineto -80 80 lineto -550 80 lineto
1599 -550 -80 lineto -80 -80 lineto -80 -550 lineto 80 -550 lineto
1600 80 -80 lineto 550 -80 lineto 550 80 lineto 80 80 lineto closepath
1602 /Add {CrossPath fill} def
1603 /Mul {45 rotate CrossPath fill} def
1604 /BoldAdd {BoldCrossPath fill} def
1605 /BoldMul {45 rotate BoldCrossPath fill} def
1606 /Oplus {CirclePath .9 .9 scale CirclePath eofill .775 .775 scale CrossPath fill } def
1607 /SolidOplus {CirclePath .775 .775 scale BoldCrossPath eofill} def
1608 /BOplus {CirclePath .8 .8 scale CirclePath eofill .775 .775 scale BoldCrossPath fill} def
1609 /Otimes {CirclePath .9 .9 scale CirclePath eofill 45 rotate .775 .775 scale CrossPath fill} def
1610 /BOtimes {CirclePath .8 .8 scale CirclePath eofill 45 rotate .775 .775 scale BoldCrossPath fill } def
1611 /SolidOtimes {CirclePath 45 rotate .775 .775 scale BoldCrossPath eofill} def
1612 /BarPath {40 660 moveto -40 660 lineto -40 -660 lineto 40 -660 lineto closepath} def
1613 /Bar {BarPath fill} def
1614 /BoldBarPath {80 660 moveto -80 660 lineto -80 -660 lineto 80 -660 lineto closepath} def
1615 /BoldBar {BoldBarPath fill} def
1616 /DiamondPath {0 742.5 moveto -428.5 0 lineto 0 -742.5 lineto 428.5 0 lineto closepath} def
1617 /SolidDiamond {DiamondPath fill} def
1618 /Diamond {DiamondPath .865 .865 scale DiamondPath eofill} def
1619 /BoldDiamond {DiamondPath .73 .73 scale DiamondPath eofill} def
1627 % Metrics 1 index get exec 0
1629 % BBoxes 3 index get exec
1630 -1000 -1000 1000 1000
1631 % -571.5 -742.5 571.5 742.5
1633 CharProcs begin load exec end
1638 1 index /Encoding get exch get
1639 1 index /BuildGlyph get exec
1643 /PSTricksDotFont exch definefont pop
1648 %%BeginProcSet: pst-node.pro 0 0
1650 % PostScript prologue for pst-node.tex.
1651 % Version 97 patch 1, 97/05/09.
1652 % For distribution, see pstricks.tex.
1654 /tx@NodeDict 400 dict def tx@NodeDict begin
1656 /T /translate load def
1658 /NewNode { % on stack: { x y } boolean N@name type InitXnode
1660 /next ED % { x y } boolean N@name type
1661 dict dup % { x y } boolean N@name dict dict
1662 3 1 roll def % { x y } boolean dict N@name dict def
1663 exch { dup 3 1 roll def } if % { x y } dict boolean
1664 begin % { x y } dict begin
1666 STV CP T exec % set scaling
1668 /NodeMtrx CM def % save CM
1674 /NewNode2 { % on stack: x y N@name type
1676 dict dup % x y N@name dict dict
1677 3 1 roll def % x y dict N@name dict def
1678 begin % x y dict begin
1680 STV CP T % set scaling
1682 /NodeMtrx CM def % save CM
1684 /NodePos { NodeSep Cos mul NodeSep Sin mul } def
1691 /NodePos { NodeSep Cos mul NodeSep Sin mul } def
1696 /NodePos { NodeSep r add dup Cos mul exch Sin mul } def
1699 /GetRnodePos { Cos 0 gt { /dx r NodeSep add def } { /dx l NodeSep sub def
1700 } ifelse Sin 0 gt { /dy u NodeSep add def } { /dy d NodeSep sub def }
1701 ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
1702 dup Sin mul Cos Div } ifelse } def
1703 /InitRnode { /Y ED /X ED X sub /r ED /l X neg def Y add neg /d ED Y sub
1704 /u ED /NodePos { GetRnodePos } def } def
1705 /DiaNodePos { w h mul w Sin mul abs h Cos mul abs add Div NodeSep add dup
1706 Cos mul exch Sin mul } def
1707 /TriNodePos { Sin s lt { d NodeSep sub dup Cos mul Sin Div exch } { w h
1708 mul w Sin mul h Cos abs mul add Div NodeSep add dup Cos mul exch Sin mul
1710 /InitTriNode { sub 2 div exch 2 div exch 2 copy T 2 copy 4 index index /d
1711 ED pop pop pop pop -90 mul rotate /NodeMtrx CM def /X 0 def /Y 0 def d
1712 sub abs neg /d ED d add /h ED 2 div h mul h d sub Div /w ED /s d w Atan
1713 sin def /NodePos { TriNodePos } def } def
1714 /OvalNodePos { /ww w NodeSep add def /hh h NodeSep add def Sin ww mul Cos
1715 hh mul Atan dup cos ww mul exch sin hh mul } def
1716 /GetCenter { begin X Y NodeMtrx transform CM itransform end } def
1718 /XYPos { dup sin exch cos Do /Cos ED /Sin ED /Dist ED Cos 0 gt { Dist
1719 Dist Sin mul Cos div } { Cos 0 lt { Dist neg Dist Sin mul Cos div neg }
1720 { 0 Dist Sin mul } ifelse } ifelse Do
1722 /GetEdge { dup 0 eq { pop begin 1 0 NodeMtrx dtransform CM idtransform
1723 exch atan sub dup sin /Sin ED cos /Cos ED /NodeSep ED NodePos NodeMtrx
1724 dtransform CM idtransform end } { 1 eq {{exch}} {{}} ifelse /Do ED pop
1727 /AddOffset { 1 index 0 eq { pop pop } { 2 copy 5 2 roll cos mul add 4 1
1728 roll sin mul sub exch } ifelse } def
1729 /GetEdgeA { NodeSepA AngleA NodeA NodeSepTypeA GetEdge OffsetA AngleA
1730 AddOffset yA add /yA1 ED xA add /xA1 ED } def
1731 /GetEdgeB { NodeSepB AngleB NodeB NodeSepTypeB GetEdge OffsetB AngleB
1732 AddOffset yB add /yB1 ED xB add /xB1 ED } def
1733 /GetArmA { ArmTypeA 0 eq { /xA2 ArmA AngleA cos mul xA1 add def /yA2 ArmA
1734 AngleA sin mul yA1 add def } { ArmTypeA 1 eq {{exch}} {{}} ifelse /Do ED
1735 ArmA AngleA XYPos OffsetA AngleA AddOffset yA add /yA2 ED xA add /xA2 ED
1737 /GetArmB { ArmTypeB 0 eq { /xB2 ArmB AngleB cos mul xB1 add def /yB2 ArmB
1738 AngleB sin mul yB1 add def } { ArmTypeB 1 eq {{exch}} {{}} ifelse /Do ED
1739 ArmB AngleB XYPos OffsetB AngleB AddOffset yB add /yB2 ED xB add /xB2 ED
1742 /b ED /a ED % second and first node
1743 /NodeSepTypeB ED /NodeSepTypeA ED
1744 /NodeSepB ED /NodeSepA ED
1745 /OffsetB ED /OffsetA ED
1746 tx@NodeDict a known tx@NodeDict b known and dup {
1749 NodeA GetCenter /yA ED /xA ED
1750 NodeB GetCenter /yB ED /xB ED } if
1753 /LPutLine { 4 copy 3 -1 roll sub neg 3 1 roll sub Atan /NAngle ED 1 t sub
1754 mul 3 1 roll 1 t sub mul 4 1 roll t mul add /Y ED t mul add /X ED } def
1755 /LPutLines { mark LPutVar counttomark 2 div 1 sub /n ED t floor dup n gt
1756 { pop n 1 sub /t 1 def } { dup t sub neg /t ED } ifelse cvi 2 mul { pop
1757 } repeat LPutLine cleartomark } def
1758 /BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
1759 /t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
1760 mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
1761 sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
1762 add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
1763 y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
1764 mul 2 bx t mul mul add cx add atan /NAngle ED /Y ED /X ED } def
1765 /HPosBegin { yB yA ge { /t 1 t sub def } if /Y yB yA sub t mul yA add def
1767 /HPosEnd { /X Y yyA sub yyB yyA sub Div xxB xxA sub mul xxA add def
1768 /NAngle yyB yyA sub xxB xxA sub Atan def } def
1769 /HPutLine { HPosBegin /yyA ED /xxA ED /yyB ED /xxB ED HPosEnd } def
1770 /HPutLines { HPosBegin yB yA ge { /check { le } def } { /check { ge } def
1771 } ifelse /xxA xA def /yyA yA def mark xB yB LPutVar { dup Y check { exit
1772 } { /yyA ED /xxA ED } ifelse } loop /yyB ED /xxB ED cleartomark HPosEnd
1774 /VPosBegin { xB xA lt { /t 1 t sub def } if /X xB xA sub t mul xA add def
1776 /VPosEnd { /Y X xxA sub xxB xxA sub Div yyB yyA sub mul yyA add def
1777 /NAngle yyB yyA sub xxB xxA sub Atan def } def
1778 /VPutLine { VPosBegin /yyA ED /xxA ED /yyB ED /xxB ED VPosEnd } def
1779 /VPutLines { VPosBegin xB xA ge { /check { le } def } { /check { ge } def
1780 } ifelse /xxA xA def /yyA yA def mark xB yB LPutVar { 1 index X check {
1781 exit } { /yyA ED /xxA ED } ifelse } loop /yyB ED /xxB ED cleartomark
1783 /HPutCurve { gsave newpath /SaveLPutVar /LPutVar load def LPutVar 8 -2
1784 roll moveto curveto flattenpath /LPutVar [ {} {} {} {} pathforall ] cvx
1785 def grestore exec /LPutVar /SaveLPutVar load def } def
1786 /NCCoor { /AngleA yB yA sub xB xA sub Atan def /AngleB AngleA 180 add def
1787 GetEdgeA GetEdgeB /LPutVar [ xB1 yB1 xA1 yA1 ] cvx def /LPutPos {
1788 LPutVar LPutLine } def /HPutPos { LPutVar HPutLine } def /VPutPos {
1789 LPutVar VPutLine } def LPutVar } def
1790 /NCLine { NCCoor tx@Dict begin ArrowA CP 4 2 roll ArrowB lineto pop pop
1792 /NCLines { false NArray n 0 eq { NCLine } { 2 copy yA sub exch xA sub
1793 Atan /AngleA ED n 2 mul dup index exch index yB sub exch xB sub Atan
1794 /AngleB ED GetEdgeA GetEdgeB /LPutVar [ xB1 yB1 n 2 mul 4 add 4 roll xA1
1795 yA1 ] cvx def mark LPutVar tx@Dict begin false Line end /LPutPos {
1796 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1798 /NCCurve { GetEdgeA GetEdgeB xA1 xB1 sub yA1 yB1 sub Pyth 2 div dup 3 -1
1799 roll mul /ArmA ED mul /ArmB ED /ArmTypeA 0 def /ArmTypeB 0 def GetArmA
1800 GetArmB xA2 yA2 xA1 yA1 tx@Dict begin ArrowA end xB2 yB2 xB1 yB1 tx@Dict
1801 begin ArrowB end curveto /LPutVar [ xA1 yA1 xA2 yA2 xB2 yB2 xB1 yB1 ]
1802 cvx def /LPutPos { t LPutVar BezierMidpoint } def /HPutPos { { HPutLines
1803 } HPutCurve } def /VPutPos { { VPutLines } HPutCurve } def } def
1806 GetEdgeA GetEdgeB GetArmA GetArmB
1807 /mtrx AngleA matrix rotate def
1808 xA2 yA2 mtrx transform pop
1809 xB2 yB2 mtrx transform exch pop
1812 mark ArmB 0 ne { xB1 yB1 } if
1813 xB2 yB2 x0 y0 xA2 yA2
1814 ArmA 0 ne { xA1 yA1 } if
1815 tx@Dict begin false Line end
1816 /LPutVar [ xB1 yB1 xB2 yB2 x0 y0 xA2 yA2 xA1 yA1 ] cvx def
1817 /LPutPos { LPutLines } def
1818 /HPutPos { HPutLines } def
1819 /VPutPos { VPutLines } def } def
1821 /NCAngle { GetEdgeA GetEdgeB GetArmB /mtrx AngleA matrix rotate def xB2
1822 yB2 mtrx itransform pop xA1 yA1 mtrx itransform exch pop mtrx transform
1823 /y0 ED /x0 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2 x0 y0 xA1 yA1
1824 tx@Dict begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 x0 y0 xA1 yA1 ]
1825 cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1826 VPutLines } def } def
1827 /NCBar { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate def
1828 xA2 yA2 mtrx itransform pop xB2 yB2 mtrx itransform pop sub dup 0 mtrx
1829 transform 3 -1 roll 0 gt { /yB2 exch yB2 add def /xB2 exch xB2 add def }
1830 { /yA2 exch neg yA2 add def /xA2 exch neg xA2 add def } ifelse mark ArmB
1831 0 ne { xB1 yB1 } if xB2 yB2 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict
1832 begin false Line end /LPutVar [ xB1 yB1 xB2 yB2 xA2 yA2 xA1 yA1 ] cvx
1833 def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1834 VPutLines } def } def
1835 /NCDiag { GetEdgeA GetEdgeB GetArmA GetArmB mark ArmB 0 ne { xB1 yB1 } if
1836 xB2 yB2 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false Line end
1837 /LPutVar [ xB1 yB1 xB2 yB2 xA2 yA2 xA1 yA1 ] cvx def /LPutPos {
1838 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1840 /NCDiagg { GetEdgeA GetArmA yB yA2 sub xB xA2 sub Atan 180 add /AngleB ED
1841 GetEdgeB mark xB1 yB1 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin
1842 false Line end /LPutVar [ xB1 yB1 xA2 yA2 xA1 yA1 ] cvx def /LPutPos {
1843 LPutLines } def /HPutPos { HPutLines } def /VPutPos { VPutLines } def }
1845 /NCLoop { GetEdgeA GetEdgeB GetArmA GetArmB /mtrx AngleA matrix rotate
1846 def xA2 yA2 mtrx transform loopsize add /yA3 ED /xA3 ED /xB3 xB2 yB2
1847 mtrx transform pop def xB3 yA3 mtrx itransform /yB3 ED /xB3 ED xA3 yA3
1848 mtrx itransform /yA3 ED /xA3 ED mark ArmB 0 ne { xB1 yB1 } if xB2 yB2
1849 xB3 yB3 xA3 yA3 xA2 yA2 ArmA 0 ne { xA1 yA1 } if tx@Dict begin false
1850 Line end /LPutVar [ xB1 yB1 xB2 yB2 xB3 yB3 xA3 yA3 xA2 yA2 xA1 yA1 ]
1851 cvx def /LPutPos { LPutLines } def /HPutPos { HPutLines } def /VPutPos {
1852 VPutLines } def } def
1853 % DG/SR modification begin - May 9, 1997 - Patch 1
1854 %/NCCircle { 0 0 NodesepA nodeA \tx@GetEdge pop xA sub 2 div dup 2 exp r
1855 %r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC yA add exch xA add
1856 %exch 2 copy /LPutVar [ 4 2 roll r AngleA ] cvx def /LPutPos { LPutVar t 360
1857 %mul add dup 5 1 roll 90 sub \tx@PtoC 3 -1 roll add /Y ED add /X ED /NAngle ED
1858 /NCCircle { NodeSepA 0 NodeA 0 GetEdge pop 2 div dup 2 exp r
1859 r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC yA add exch xA add
1860 exch 2 copy /LPutVar [ 4 2 roll r AngleA ] cvx def /LPutPos { LPutVar t 360
1861 mul add dup 5 1 roll 90 sub PtoC 3 -1 roll add /Y ED add /X ED /NAngle ED
1862 % DG/SR modification end
1863 } def /HPutPos { LPutPos } def /VPutPos { LPutPos } def r AngleA 90 sub a add
1864 AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c 57.2957 r
1865 Div def /y ED /x ED } def
1866 /NCBox { /d ED /h ED /AngleB yB yA sub xB xA sub Atan def /AngleA AngleB
1867 180 add def GetEdgeA GetEdgeB /dx d AngleB sin mul def /dy d AngleB cos
1868 mul neg def /hx h AngleB sin mul neg def /hy h AngleB cos mul def
1869 /LPutVar [ xA1 hx add yA1 hy add xB1 hx add yB1 hy add xB1 dx add yB1 dy
1870 add xA1 dx add yA1 dy add ] cvx def /LPutPos { LPutLines } def /HPutPos
1871 { xB yB xA yA LPutLine } def /VPutPos { HPutPos } def mark LPutVar
1872 tx@Dict begin false Polygon end } def
1873 /NCArcBox { /l ED neg /d ED /h ED /a ED /AngleA yB yA sub xB xA sub Atan
1874 def /AngleB AngleA 180 add def /tA AngleA a sub 90 add def /tB tA a 2
1875 mul add def /r xB xA sub tA cos tB cos sub Div dup 0 eq { pop 1 } if def
1876 /x0 xA r tA cos mul add def /y0 yA r tA sin mul add def /c 57.2958 r div
1877 def /AngleA AngleA a sub 180 add def /AngleB AngleB a add 180 add def
1878 GetEdgeA GetEdgeB /AngleA tA 180 add yA yA1 sub xA xA1 sub Pyth c mul
1879 sub def /AngleB tB 180 add yB yB1 sub xB xB1 sub Pyth c mul add def l 0
1880 eq { x0 y0 r h add AngleA AngleB arc x0 y0 r d add AngleB AngleA arcn }
1881 { x0 y0 translate /tA AngleA l c mul add def /tB AngleB l c mul sub def
1882 0 0 r h add tA tB arc r h add AngleB PtoC r d add AngleB PtoC 2 copy 6 2
1883 roll l arcto 4 { pop } repeat r d add tB PtoC l arcto 4 { pop } repeat 0
1884 0 r d add tB tA arcn r d add AngleA PtoC r h add AngleA PtoC 2 copy 6 2
1885 roll l arcto 4 { pop } repeat r h add tA PtoC l arcto 4 { pop } repeat }
1886 ifelse closepath /LPutVar [ x0 y0 r AngleA AngleB h d ] cvx def /LPutPos
1887 { LPutVar /d ED /h ED /AngleB ED /AngleA ED /r ED /y0 ED /x0 ED t 1 le {
1888 r h add AngleA 1 t sub mul AngleB t mul add dup 90 add /NAngle ED PtoC }
1889 { t 2 lt { /NAngle AngleB 180 add def r 2 t sub h mul t 1 sub d mul add
1890 add AngleB PtoC } { t 3 lt { r d add AngleB 3 t sub mul AngleA 2 t sub
1891 mul add dup 90 sub /NAngle ED PtoC } { /NAngle AngleA 180 add def r 4 t
1892 sub d mul t 3 sub h mul add add AngleA PtoC } ifelse } ifelse } ifelse
1893 y0 add /Y ED x0 add /X ED } def /HPutPos { LPutPos } def /VPutPos {
1895 /Tfan { /AngleA yB yA sub xB xA sub Atan def GetEdgeA w xA1 xB sub yA1 yB
1896 sub Pyth Pyth w Div CLW 2 div mul 2 div dup AngleA sin mul yA1 add /yA1
1897 ED AngleA cos mul xA1 add /xA1 ED /LPutVar [ xA1 yA1 m { xB w add yB xB
1898 w sub yB } { xB yB w sub xB yB w add } ifelse xA1 yA1 ] cvx def /LPutPos
1899 { LPutLines } def /VPutPos@ { LPutVar flag { 8 4 roll pop pop pop pop }
1900 { pop pop pop pop 4 2 roll } ifelse } def /VPutPos { VPutPos@ VPutLine }
1901 def /HPutPos { VPutPos@ HPutLine } def mark LPutVar tx@Dict begin
1902 /ArrowA { moveto } def /ArrowB { } def false Line closepath end } def
1904 /LPutCoor { NAngle tx@Dict begin /NAngle ED end gsave CM STV CP Y sub neg
1905 exch X sub neg exch moveto setmatrix CP grestore } def
1907 /LPut { tx@NodeDict /LPutPos known { LPutPos } { CP /Y ED /X ED /NAngle 0
1908 def } ifelse LPutCoor } def
1909 /HPutAdjust { Sin Cos mul 0 eq { 0 } { d Cos mul Sin div flag not { neg }
1910 if h Cos mul Sin div flag { neg } if 2 copy gt { pop } { exch pop }
1911 ifelse } ifelse s add flag { r add neg } { l add } ifelse X add /X ED }
1913 /VPutAdjust { Sin Cos mul 0 eq { 0 } { l Sin mul Cos div flag { neg } if
1914 r Sin mul Cos div flag not { neg } if 2 copy gt { pop } { exch pop }
1915 ifelse } ifelse s add flag { d add } { h add neg } ifelse Y add /Y ED }
1921 %%BeginProcSet: solides.pro 0 0
1923 % PostScript prologue for pst-solides3d.tex.
1924 % Version 4.03, 2008/07/12
1926 %% COPYRIGHT 2008 by Jean-Paul Vignault
1928 %% This program can be redistributed and/or modified under the terms
1929 %% of the LaTeX Project Public License Distributed from CTAN
1930 %% archives in directory macros/latex/base/lppl.txt.
1932 /SolidesDict 100 dict def
1933 /SolidesbisDict 100 dict def
1936 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1937 %% %% les variables globales gerees par PSTricks %%
1938 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1939 %% %% les lignes dessous sont a decommenter si l on veut utiliser le
1940 %% %% fichier solides.pro independamment du package PSTricks
1945 %% /XpointVue {Dobs Cos1Cos2 mul} def
1946 %% /YpointVue {Dobs Sin1Cos2 mul} def
1947 %% /ZpointVue {Dobs Sin2 mul} def
1949 %% /solidhollow false def
1950 %% /solidbiface false def
1952 %% /tracelignedeniveau? true def
1953 %% /hauteurlignedeniveau 1 def
1954 %% /couleurlignedeniveau {rouge} def
1955 %% /linewidthlignedeniveau 4 def
1956 %% /solidgrid true def
1957 /aretescachees true def
1958 /defaultsolidmode 2 def
1959 /Stroke { strokeopacity .setopacityalpha stroke } def
1960 /Fill { fillopacity .setopacityalpha fill } def
1962 %% variables globales specifiques a PSTricks
1963 %% /activationgestioncouleurs true def
1974 /angle_repere 90 def
1978 /pl@n-en-cours false def
1981 [6.25 3.75] 1.25 setdash
1983 /stockcurrentcpath {} def
1984 /newarrowpath {} def
1985 /chaine 15 string def
1987 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1988 %% choix d une fonte accentuee pour le .ps %%
1989 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1990 /ReEncode { exch findfont
1991 dup length dict begin { 1 index /FID eq {pop pop} {def} ifelse
1992 }forall /Encoding ISOLatin1Encoding def currentdict end definefont
1994 /Font /Times-Roman /ISOfont ReEncode /ISOfont def
1995 %Font findfont 10 scalefont setfont
1997 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1998 %% extrait de color.pro pour pouvoir recuperer ses couleurs %%
1999 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2000 /GreenYellow{0.15 0 0.69 0 setcmykcolor}def
2001 /Yellow{0 0 1 0 setcmykcolor}def
2002 /Goldenrod{0 0.10 0.84 0 setcmykcolor}def
2003 /Dandelion{0 0.29 0.84 0 setcmykcolor}def
2004 /Apricot{0 0.32 0.52 0 setcmykcolor}def
2005 /Peach{0 0.50 0.70 0 setcmykcolor}def
2006 /Melon{0 0.46 0.50 0 setcmykcolor}def
2007 /YellowOrange{0 0.42 1 0 setcmykcolor}def
2008 /Orange{0 0.61 0.87 0 setcmykcolor}def
2009 /BurntOrange{0 0.51 1 0 setcmykcolor}def
2010 /Bittersweet{0 0.75 1 0.24 setcmykcolor}def
2011 /RedOrange{0 0.77 0.87 0 setcmykcolor}def
2012 /Mahogany{0 0.85 0.87 0.35 setcmykcolor}def
2013 /Maroon{0 0.87 0.68 0.32 setcmykcolor}def
2014 /BrickRed{0 0.89 0.94 0.28 setcmykcolor}def
2015 /Red{0 1 1 0 setcmykcolor}def
2016 /OrangeRed{0 1 0.50 0 setcmykcolor}def
2017 /RubineRed{0 1 0.13 0 setcmykcolor}def
2018 /WildStrawberry{0 0.96 0.39 0 setcmykcolor}def
2019 /Salmon{0 0.53 0.38 0 setcmykcolor}def
2020 /CarnationPink{0 0.63 0 0 setcmykcolor}def
2021 /Magenta{0 1 0 0 setcmykcolor}def
2022 /VioletRed{0 0.81 0 0 setcmykcolor}def
2023 /Rhodamine{0 0.82 0 0 setcmykcolor}def
2024 /Mulberry{0.34 0.90 0 0.02 setcmykcolor}def
2025 /RedViolet{0.07 0.90 0 0.34 setcmykcolor}def
2026 /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}def
2027 /Lavender{0 0.48 0 0 setcmykcolor}def
2028 /Thistle{0.12 0.59 0 0 setcmykcolor}def
2029 /Orchid{0.32 0.64 0 0 setcmykcolor}def
2030 /DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}def
2031 /Purple{0.45 0.86 0 0 setcmykcolor}def
2032 /Plum{0.50 1 0 0 setcmykcolor}def
2033 /Violet{0.79 0.88 0 0 setcmykcolor}def
2034 /RoyalPurple{0.75 0.90 0 0 setcmykcolor}def
2035 /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}def
2036 /Periwinkle{0.57 0.55 0 0 setcmykcolor}def
2037 /CadetBlue{0.62 0.57 0.23 0 setcmykcolor}def
2038 /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}def
2039 /MidnightBlue{0.98 0.13 0 0.43 setcmykcolor}def
2040 /NavyBlue{0.94 0.54 0 0 setcmykcolor}def
2041 /RoyalBlue{1 0.50 0 0 setcmykcolor}def
2042 /Blue{1 1 0 0 setcmykcolor}def
2043 /Cerulean{0.94 0.11 0 0 setcmykcolor}def
2044 /Cyan{1 0 0 0 setcmykcolor}def
2045 /ProcessBlue{0.96 0 0 0 setcmykcolor}def
2046 /SkyBlue{0.62 0 0.12 0 setcmykcolor}def
2047 /Turquoise{0.85 0 0.20 0 setcmykcolor}def
2048 /TealBlue{0.86 0 0.34 0.02 setcmykcolor}def
2049 /Aquamarine{0.82 0 0.30 0 setcmykcolor}def
2050 /BlueGreen{0.85 0 0.33 0 setcmykcolor}def
2051 /Emerald{1 0 0.50 0 setcmykcolor}def
2052 /JungleGreen{0.99 0 0.52 0 setcmykcolor}def
2053 /SeaGreen{0.69 0 0.50 0 setcmykcolor}def
2054 /Green{1 0 1 0 setcmykcolor}def
2055 /ForestGreen{0.91 0 0.88 0.12 setcmykcolor}def
2056 /PineGreen{0.92 0 0.59 0.25 setcmykcolor}def
2057 /LimeGreen{0.50 0 1 0 setcmykcolor}def
2058 /YellowGreen{0.44 0 0.74 0 setcmykcolor}def
2059 /SpringGreen{0.26 0 0.76 0 setcmykcolor}def
2060 /OliveGreen{0.64 0 0.95 0.40 setcmykcolor}def
2061 /RawSienna{0 0.72 1 0.45 setcmykcolor}def
2062 /Sepia{0 0.83 1 0.70 setcmykcolor}def
2063 /Brown{0 0.81 1 0.60 setcmykcolor}def
2064 /Tan{0.14 0.42 0.56 0 setcmykcolor}def
2065 /Gray{0 0 0 0.50 setcmykcolor}def
2066 /Black{0 0 0 1 setcmykcolor}def
2067 /White{0 0 0 0 setcmykcolor}def
2068 %% fin de l extrait color.pro
2070 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2071 %%%% autres couleurs %%%%
2072 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2074 /bleu {0 0 1 setrgbcolor} def
2075 /rouge {1 0 0 setrgbcolor} def
2076 /vert {0 .5 0 setrgbcolor} def
2077 /gris {.4 .4 .4 setrgbcolor} def
2078 /jaune {1 1 0 setrgbcolor} def
2079 /noir {0 0 0 setrgbcolor} def
2080 /blanc {1 1 1 setrgbcolor} def
2081 /orange {1 .65 0 setrgbcolor} def
2082 /rose {1 .01 .58 setrgbcolor} def
2083 /cyan {1 0 0 0 setcmykcolor} def
2084 /magenta {0 1 0 0 setcmykcolor} def
2086 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2087 %%%% definition du point de vue %%%%
2088 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2089 %% pour la 3D conventionnelle
2090 %% Dony : graphisme scientifique : page 187
2093 %% calcul des coefficients de la matrice
2094 %% de transformation
2095 /Sin1 {THETA sin} def
2097 /Cos1 {THETA cos} def
2099 /Cos1Sin2 {Cos1 Sin2 mul} def
2100 /Sin1Sin2 {Sin1 Sin2 mul} def
2101 /Cos1Cos2 {Cos1 Cos2 mul} def
2102 /Sin1Cos2 {Sin1 Cos2 mul} def
2110 Xabscisse Sin1 mul neg Yordonnee Cos1 mul add
2113 Xabscisse Cos1Sin2 mul neg Yordonnee Sin1Sin2 mul sub Zcote Cos2
2117 Xabscisse neg Cos1Cos2 mul Yordonnee Sin1Cos2 mul sub Zcote Sin2
2120 %% maintenant on depose les resultats sur la pile
2121 Decran xObservateur mul zObservateur div cm
2122 Decran yObservateur mul zObservateur div cm
2136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2137 %%%% jps modifie pour PSTricks %%%%
2138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2140 /solid {continu} def
2141 /dashed {pointilles} def
2143 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2144 %%%% geometrie basique %%%%
2145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2147 %% syntaxe~: [x1 y1 ... xn yn] ligne
2158 %% syntaxe~: [x1 y1 ... xn yn] ligne_
2167 %% syntaxe~: [x1 y1 ... xn yn] polygone
2170 /startest {true} def
2190 currentlinewidth 0 eq {} {Stroke} ifelse
2194 %% syntaxe : x y point
2213 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2214 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2216 %%%% insertion librairie jps %%%%
2218 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2219 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2221 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2222 %%%% le repere jps %%%%
2223 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2225 /sysatan {systemdict /atan get exec} def
2226 /atan {2 copy 0 0 eqp {pop pop 0} {sysatan} ifelse} def
2227 %%%%% ### AAAscale ###
2228 %%%%%%%%%%%%%%%% les deplacements a l echelle %%%%%%%%%%%%%%%%%%%
2230 /v@ct_I {xunit 0} def
2231 /v@ct_J {angle_repere cos yunit mul angle_repere sin yunit mul} def
2240 /gtransform-1 {} def
2254 xtranslate ytranslate
2255 3 1 roll %% xA yB yA xB
2256 4 1 roll %% xB xA yB yA
2257 sub neg 3 1 roll %% yB-yA xB xA
2263 xtranslate ytranslate
2264 3 1 roll %% xA yB yA xB
2265 4 1 roll %% xB xA yB yA
2266 sub neg 3 1 roll %% yB-yA xB xA
2272 /Y exch yscale-1 def
2273 /X exch xscale-1 def
2274 /y Y yunit angle_repere sin mul div def
2275 /x X y yunit mul angle_repere cos mul sub xunit div def
2306 %%%%% ### fin insertion ###
2308 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2309 %%%% methodes numeriques %%%%
2310 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2312 %%%%% ### solve2nddegre ###
2313 %% syntaxe : a b c solve2nddegre --> x1 x2
2319 /delt@ @b dup mul 4 @a mul @c mul sub def
2320 @b neg delt@ sqrt sub 2 @a mul div
2321 @b neg delt@ sqrt add 2 @a mul div
2325 %%%%% ### fin insertion ###
2327 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2331 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2333 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2335 %%%%% ### tripointangle ###
2336 %% syntaxe : A B C tripointangle --> angle ABC
2355 %% syntaxe : A B angle
2356 %% --> num, l'angle defini par le vecteur AB dans le repere orthonorme jps
2364 %% syntaxe : A B pangle
2365 %% --> num, l'angle defini par le vecteur AB dans le repere postscript
2367 jtoppoint exchp jtoppoint exchp vecteur exch atan
2373 %%%%% ### setxrange ###
2379 %%%%% ### setyrange ###
2385 %%%%% ### defpoint ###
2386 %% syntaxe : xA yA /A defpoint
2389 /t@mp@r@ire exch def
2390 [ 3 1 roll ] cvx t@mp@r@ire exch
2394 %%%%% ### milieu ###
2395 %% syntaxe~: A B milieu
2398 3 -1 roll %% xA xB yB yA
2399 add 2 div %% xA xB yM
2400 3 1 roll %% yM xA xB
2405 %%%%% ### parallelopoint ###
2406 %% syntaxe : A B C parallelopoint --> point D, tel que ABCD parallelogramme
2418 /d1 {A B C paral} def
2419 /d2 {B C A paral} def
2424 %%%%% ### translatepoint ###
2425 %% syntaxe : A u translatepoint --> B image de A par la translation de vecteur u
2430 %%%%% ### rotatepoint ###
2431 %% syntaxe : B A r rotatepoint --> C image de B par la rotation de centre A,
2432 %% d'angle r (en degre)
2433 %% En prenant les affixes des pts associes, il vient
2434 %% (zC - zA) = (zB-zA) e^(ir)
2436 %% zC = (zB-zA) e^(ir) + zA
2437 /rotatepoint { %% B, A, r
2438 5 copy %% B, A, r, B, A, r
2439 cos 5 1 roll %% B, A, r, cos r, B, A
2440 4 1 roll %% B, A, r, cos r, yA, B, xA
2441 4 1 roll %% B, A, r, cos r, A, B
2442 vecteur %% B, A, r, cos r, xB-xA, yB-yA
2443 4 -1 roll sin %% B, A, cos r, xB-xA, yB-yA, sin r
2444 4 copy mul %% B, A, cos r, xB-xA, yB-yA, sin r, cos r, xB-xA, (yB-yA) sin r
2445 7 1 roll mul %% B, A, (yB-yA) sin r, cos r, xB-xA, yB-yA, sin r, cos r (xB-xA)
2446 5 1 roll %% B, A, (yB-yA) sin r, cos r (xB-xA), cos r, xB-xA, yB-yA, sin r
2447 exch %% B, A, (yB-yA) sin r, cos r (xB-xA), cos r, xB-xA, sin r, yB-yA
2448 4 -1 roll mul %% B, A, (yB-yA) sin r, cos r (xB-xA), xB-xA, sin r, (yB-yA)cos r
2449 3 1 roll mul %% B, A, (yB-yA) sin r, cos r (xB-xA), (yB-yA) cos r, (xB-xA) sin r
2450 add %% B, A, (yB-yA) sin r, cos r (xB-xA), (yB-yA) cos r +(xB-xA) sin r
2451 3 1 roll %% B, A, (yB-yA) cos r + (xB-xA) sin r, (yB-yA) sin r, cos r (xB-xA),
2452 exch sub %% B, A, (yB-yA) cos r + (xB-xA) sin r, cos r (xB-xA)-(yB-yA) sin r
2453 exch %% B, zA, (zB-zA) e^(ir)
2459 %%%%% ### hompoint ###
2460 %% syntaxe : B A alpha hompoint -> le point A' tel que AA' = alpha AB
2464 vecteur %% vecteur BA
2467 mulv %% alpha x vecteur AB
2474 %%%%% ### orthoproj ###
2475 %% syntaxe : A D orthoproj --> B, le projete orthogonal de A sur D
2481 7 -1 roll pop %% D D A
2486 %% syntaxe : A projx --> le projete orthogonal de A sur Ox
2491 %% syntaxe : A projy --> le projete orthogonal de A sur Oy
2496 %%%%% ### sympoint ###
2497 %% syntaxe : A I sympoint --> point A', le symetrique de A par rapport
2507 %%%%% ### axesympoint ###
2508 %% syntaxe : A D axesympoint --> point B, le symetrique de A par rapport
2523 %%%%% ### cpoint ###
2524 %% syntaxe : alpha C cpoint -> M, le point du cercle C correspondant a
2526 /cpoint { %% a, xI, yI, r
2528 dup %% a, xI, yI, r, r
2529 5 -1 roll %% xI, yI, r, r, a
2531 alpha cos mul %% xI, yI, r, r cos a
2533 alpha sin mul %% xI, yI, r cos a, r sin a
2534 3 -1 roll add %% xI, r cos a, yI + r sin a
2535 3 1 roll %% yI + r sin a, xI, r cos a,
2536 add exch %% xI + r cos a, yI + r sin a
2540 %%%%% ### xdpoint ###
2541 %% x A B xdpoint : le point de la droite (AB) d'abscisse x
2547 /a pt1 pt2 coeffdir def
2548 /b pt1 pt2 ordorig def
2553 %%%%% ### ydpoint ###
2554 %% y A B ydpoint : le point de la droite (AB) d'ordonnee y
2565 /a pt1 pt2 coeffdir def
2566 /b pt1 pt2 ordorig def
2573 %%%%% ### ordonnepoints ###
2574 %% syntaxe : xA yA xB yB ordonnepoints --> idem si yB>yA ou si yB=yA
2575 %% avec xB>xA, sinon xB yB xA yA
2578 exch pop %% ... xA, yA, yB
2580 {pop} %% oui, c'est fini
2583 exch pop %% ... xA, yA, yB
2586 3 copy %% oui, yA = yB
2587 pop pop %% ... xA, xB
2589 {} %% oui, c'est fini
2590 { %% non, on echange A et B
2596 { %% non : yA < yB => on echange A et B
2606 %%%%% ### distance ###
2607 %% syntaxe~: A B distance
2608 /distance { %% xA yA xB yB
2610 dup mul exch %% y^2 x
2621 %%%%% ### fin insertion ###
2622 /interdroites {interdroite} def
2624 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2626 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2628 %%%%% ### vecteur ###
2629 %% syntaxe~: A B vecteur
2632 3 -1 roll %% xA xB yB yA
2634 3 1 roll %% yB-yA xA xB
2635 exch sub %% yB-yA xB-xA
2639 %%%%% ### normalize ###
2640 %% syntaxe : u normalize -> u / ||u||
2650 %% syntaxe : u v addv --> u+v
2651 /addv { %% xA yA xB yB
2652 3 1 roll %% xA yB yA xB
2653 4 1 roll %% xB xA yB yA
2654 add 3 1 roll %% yB+yA xB xA
2659 %% syntaxe : u v subv --> u - v
2660 /subv { %% xA yA xB yB
2666 %% syntaxe : u a mulv --> au
2667 /mulv { %% xA, yA, a
2669 3 1 roll %% xA, a, yA, a
2670 mul 3 1 roll %% ayA, xA, a
2674 %%%%% ### scalprod ###
2675 %% syntaxe : u v scalprod --> le produit scalaire de u par v
2685 %%%%% ### normal ###
2686 %% syntaxe : u normal --> v tel u.v = 0
2692 %% syntaxe : u norme --> |u|
2700 %%%%% ### oldarrow ###
2701 %% syntaxe : A B oldarrow --> trace fleche en B, direction AB
2708 oldarrowangle rotate
2711 A B vecteur normalize /u defpoint
2712 u neg exch /v defpoint
2713 u oldarrowpointe neg mulv rmoveto %% ainsi c'est la pointe qui est en (0, 0)
2714 %% le pt extremal arriere haut
2715 u oldarrowplume neg mulv %% l'abscisse
2716 v oldarrow@ngle sin oldarrow@ngle cos div oldarrowplume mul mulv addv %% l'ordonnee
2718 u oldarrowplume oldarrowpointe add mulv
2719 v oldarrow@ngle sin oldarrow@ngle cos div oldarrowplume mul neg mulv addv
2721 u oldarrowplume oldarrowpointe add neg mulv
2722 v oldarrow@ngle sin oldarrow@ngle cos div oldarrowplume mul neg mulv addv
2729 /oldarrowpointe {xunit 5 div} def
2730 /oldarrowplume {xunit 10 div} def
2731 /oldarrow@ngle 45 def
2732 /oldarrowscale {1 1} def
2733 /oldarrowangle 0 def %% pour l'utilisateur
2735 %%%%% ### drawvecteur ###
2736 %% syntaxe : A B drawvecteur
2746 %%%%% ### orthovecteur ###
2747 %% syntaxe : u orthovecteur --> v, vecteur orthogonal a u
2752 %%%%% ### fin insertion ###
2754 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2756 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2758 %%%%% ### defcercle ###
2759 %% syntaxe : A r /d defcercle
2762 /t@mp@r@ire exch def
2763 [ 4 1 roll ] cvx t@mp@r@ire exch
2767 %%%%% ### interdroitecercle ###
2768 %% intersection de la droite y = ax+b avec le cercle (x-x0)^2 + (y-y0)^2 = r^2
2770 %% { | x = - -----, y = (b + a x0 + a y0 + (2 a b y0 - 2 a b x0 +
2773 %% 3 2 2 2 2 4 2 2 2 4 2 2
2774 %% 2 a x0 y0 - a b + a r + a r - a y0 - a x0 )^(1/2)) / (a + 1)
2781 %% | x = - -----, y = (b + a x0 + a y0 - (2 a b y0 - 2 a b x0 +
2784 %% 3 2 2 2 2 4 2 2 2 4 2 2
2785 %% 2 a x0 y0 - a b + a r + a r - a y0 - a x0 )^(1/2)) / (a + 1)
2791 %% intersection de la droite x = a avec le cercle (x-x0)^2 + (y-y0)^2 = r^2
2793 %% {[x = a, y = y0 + (2 a x0 - a + r - x0 ) ],
2796 %% [x = a, y = y0 - (2 a x0 - a + r - x0 ) ]}
2798 %% intersection de la droite y = b avec le cercle (x-x0)^2 + (y-y0)^2 = r^2
2800 %% {[y = b, x = x0 + (2 b y0 - b + r - y0 ) ],
2803 %% [y = b, x = x0 - (2 b y0 - b + r - y0 ) ]}
2805 %% syntaxe : D I r interdroitecercle
2806 /interdroitecercle {
2816 xA yA xB yB verticale?
2818 %% la droite est verticale
2823 2 xA mul x0 mul xA dup mul sub r dup mul add x0 dup mul sub sqrt
2833 %% la droite n'est pas verticale
2835 /a xA yA xB yB coeffdir def
2836 /b xA yA xB yB ordorig def
2839 %% la droite est horizontale
2858 %% la droite n'est pas horizontale
2863 a dup mul y0 mul add
2866 2 a dup mul mul b mul y0 mul
2867 2 a 3 exp mul b mul x0 mul sub
2868 2 a 3 exp mul x0 mul y0 mul add
2869 a dup mul b dup mul mul sub
2870 a dup mul r dup mul mul add
2871 a 4 exp r dup mul mul add
2872 a dup mul y0 dup mul mul sub
2873 a 4 exp x0 dup mul mul sub
2880 quantite1 quantite2 add quantite3 div
2886 quantite1 quantite2 sub quantite3 div
2902 %%%%% ### intercercle ###
2903 %% syntaxe : cerc1 cerc2 intercercle --> A B les points d'intersection
2904 %% des 2 cercles, tries par 'ordonnepoints'
2914 %% on translate pour se ramener a (x1, y1) = (0, 0)
2919 %% on prepare l'equation du 2nd degre
2922 %% {y = RootOf((4 x2 + 4 y2 ) _Z
2925 %% + (-4 y2 - 4 r1~ y2 + 4 y2 r2~ - 4 x2 y2) _Z + x2
2927 %% 4 2 2 2 2 2 2 2 2
2928 %% + r2~ - 2 y2 r2~ + 2 x2 y2 - 2 x2 r2~ - 2 r1~ x2
2931 %% + r1~ + y2 + 2 r1~ y2 - 2 r1~ r2~ ), x = 1/2 (-2 y2
2934 %% RootOf((4 x2 + 4 y2 ) _Z
2937 %% + (-4 y2 - 4 r1~ y2 + 4 y2 r2~ - 4 x2 y2) _Z + x2
2939 %% 4 2 2 2 2 2 2 2 2
2940 %% + r2~ - 2 y2 r2~ + 2 x2 y2 - 2 x2 r2~ - 2 r1~ x2
2942 %% 4 4 2 2 2 2 2 2 2
2943 %% + r1~ + y2 + 2 r1~ y2 - 2 r1~ r2~ ) + r1~ + x2 + y2
2948 %% coeff pour le degre 2
2951 %% {y = RootOf((4 x2 + 4 y2 ) _Z
2953 4 y2 dup mul mul add
2956 %% coeff pour le degre 1
2960 %% + (-4 y2 - 4 r1~ y2 + 4 y2 r2~ - 4 x2 y2) _Z
2962 4 r1 dup mul mul y2 mul sub
2963 4 r2 dup mul mul y2 mul add
2964 4 x2 dup mul mul y2 mul sub
2967 %% coeff pour le degre 0
2974 %% 4 2 2 2 2 2 2 2 2
2975 %% + r2~ - 2 y2 r2~ + 2 x2 y2 - 2 x2 r2~ - 2 r1~ x2
2977 2 y2 dup mul mul r2 dup mul mul sub
2978 2 x2 dup mul mul y2 dup mul mul add
2979 2 x2 dup mul mul r2 dup mul mul sub
2980 2 x2 dup mul mul r1 dup mul mul sub
2983 %% + r1~ + y2 + 2 r1~ y2 - 2 r1~ r2~ )
2986 2 r1 dup mul mul y2 dup mul mul add
2987 2 r1 dup mul mul r2 dup mul mul sub
3028 %% on depose le resultat, en n'oubliant pas de retranslater en sens
3037 %%%%% ### ABcercle ###
3038 %% syntaxe : A B C ABcercle --> le cercle passant par A, B, C
3052 %%%%% ### diamcercle ###
3053 %% syntaxe : A B diamcercle --> le cercle de diametre [AB]
3062 %%%%% ### fin insertion ###
3064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3068 %%%%% ### horizontale ###
3069 %% syntaxe : y horizontale
3077 %%%%% ### coeffdir ###
3078 %% syntaxe~: A B coeffdir
3083 %%%%% ### ordorig ###
3084 %% syntaxe : A B ordorig
3085 %% attention, la droite est supposee ne pas etre verticale
3088 dr@ite 3 3 -1 roll put
3089 dr@ite 2 3 -1 roll put
3090 dr@ite 1 3 -1 roll put
3091 dr@ite 0 3 -1 roll put
3092 dr@ite aload pop coeffdir /c@eff exch def
3093 dr@ite aload pop pop pop %% xA yA
3098 %%%%% ### verticale ###
3099 %% syntaxe~: A B verticale?
3105 %% syntaxe : x verticale
3113 %%%%% ### droite ###
3114 %% %% syntaxe : A B droite
3132 %% stockcurrentcpath
3137 %% /alpha xA yA xB yB coeffdir def
3138 %% /beta xA yA xB yB ordorig def
3139 %% xmin dup alpha mul beta add smoveto
3140 %% xmax dup alpha mul beta add slineto
3141 %% stockcurrentcpath
3151 %% syntaxe : A B droite
3165 %% on cherche le point le + a gauche
3166 xmin A B xdpoint /C defpoint
3167 C exch pop ymin lt {
3169 ymin A B ydpoint /C defpoint
3171 C exch pop ymax gt {
3173 ymax A B ydpoint /C defpoint
3175 %% on cherche le point le + a droite
3176 xmax A B xdpoint /D defpoint
3177 D exch pop ymin lt {
3179 ymin A B ydpoint /D defpoint
3181 D exch pop ymax gt {
3183 ymax A B ydpoint /D defpoint
3195 %%%%% ### defdroite ###
3196 %% syntaxe : A B /d defdroite
3199 /t@mp@r@ire exch def
3200 [ 5 1 roll ] cvx t@mp@r@ire exch
3205 %% syntaxe : D A paral --> droite parallele a D passant par A
3215 u1 u2 translatepoint
3219 %%%%% ### interdroite ###
3222 /dr@ite2 4 array def
3223 dr@ite2 3 3 -1 roll put
3224 dr@ite2 2 3 -1 roll put
3225 dr@ite2 1 3 -1 roll put
3226 dr@ite2 0 3 -1 roll put
3227 /dr@ite1 4 array def
3228 dr@ite1 3 3 -1 roll put
3229 dr@ite1 2 3 -1 roll put
3230 dr@ite1 1 3 -1 roll put
3231 dr@ite1 0 3 -1 roll put
3233 %%% %% trace pour deboguage
3234 %%% dr@ite1 aload pop droite
3235 %%% dr@ite2 aload pop droite
3237 %%% Dans tous les cas, on suppose que l'intersection existe
3239 %%% * la 1ere droite est verticale. les equations reduites sont
3240 %%% x = a1 et y = a2 x + b2
3241 %%% Le point d'intersection est :
3242 %%% {{x = a1, y = b2 + a1 a2}}
3244 %%% * la 2eme droite est verticale. les equations reduites sont
3245 %%% x = a1 x+ b1 et x = a2
3246 %%% Le point d'intersection est :
3247 %%% {{x = a2, y = b1 + a1 a2}}
3249 %%% * aucune n'est verticale. Les equations reduites sont
3250 %%% y = a1 x + b1 et y = a2 x + b2
3251 %%% Le point d'intersection est :
3252 %%% { { b2 - b1 a1 b2 - a2 b1 } }
3253 %%% { { x = -------, y = ------------- } }
3254 %%% { { a1 - a2 a1 - a2 } }
3256 %%% remarque : pour le moment, je n'arrive pas a rendre mes variables
3257 %%% locales : elle restent globales. Pour que cela ne soit pas trop
3258 %%% genant, je les note respectivement @1, @@1, @2 et @@2 au lieu de a1,
3261 dr@ite1 aload pop verticale?
3263 /@1 {dr@ite1 aload pop pop pop pop} def
3264 /@2 {dr@ite2 aload pop coeffdir} def
3265 /@@2 {dr@ite2 aload pop ordorig} def
3270 dr@ite2 aload pop verticale?
3272 /@1 {dr@ite1 aload pop coeffdir} def
3273 /@@1 {dr@ite1 aload pop ordorig} def
3274 /@2 {dr@ite2 aload pop pop pop pop} def
3279 /@1 {dr@ite1 aload pop coeffdir} def
3280 /@@1 {dr@ite1 aload pop ordorig} def
3281 /@2 {dr@ite2 aload pop coeffdir} def
3282 /@@2 {dr@ite2 aload pop ordorig} def
3283 @@2 @@1 sub @1 @2 sub div
3284 @1 @@2 mul @2 @@1 mul sub
3293 %% syntaxe : D A perp --> droite perpendiculaire a D passant par A
3298 vecteur orthovecteur
3303 u1 u2 translatepoint
3307 %%%%% ### mediatrice ###
3308 %% synaxe : A B mediatrice --> droite
3315 %%%%% ### bissectrice ###
3316 %% syntaxe : A B C bissectrice --> B E ou E est un point de la bissectrice
3328 /alpha {A B C tripointangle} def
3330 A B alpha rotatepoint
3335 %%%%% ### angledroit ###
3336 /widthangledroit 5 def
3338 %% syntaxe : A B C angledroit --> dessine un angle droit en B
3342 /widthangledroit exch def
3347 B C vecteur normalize widthangledroit 20 div mulv /u defpoint
3348 B A vecteur normalize widthangledroit 20 div mulv /v defpoint
3349 [B u addv dupp v addv B v addv] ligne
3353 %%%%% ### translatedroite ###
3354 %% syntaxe : A B u translatedroite --> C D images resp de A et B par la translation de vecteur u
3355 /translatedroite { %% A B u
3367 %%%%% ### rotatedroite ###
3368 %% syntaxe : A B O r rotatedroite --> C D images resp de A et B par la
3369 %% rotation de centre O et d'angle r (en degre)
3371 5 copy rotatepoint %% A B O r D
3372 6 -1 roll pop %% A xB O r D
3373 6 -1 roll pop %% A O r D
3375 7 1 roll rotatepoint %% D C
3387 %%%%% ### axesymdroite ###
3388 %% syntaxe : d D axesymdroite --> droite d', symetrique de la droite d par rapport
3399 %%%%% ### fin insertion ###
3401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3403 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3405 %%%%% ### poltransformfile ###
3406 %% syntaxe : pol u translatepol --> pol'
3411 {ux uy translatepoint} papply
3415 %% syntaxe : pol u rotatepol --> pol'
3420 {I alpha rotatepoint} papply
3424 %% syntaxe : pol I alpha hompol --> pol'
3429 {I alpha hompoint} papply
3433 %% syntaxe : pol I sympol --> pol'
3441 %% syntaxe : pol D axesympol --> pol'
3445 {D axesympoint} papply
3449 %%%%% ### fin insertion ###
3451 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3453 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3455 %%%%% ### isbool ###
3456 %% syntaxe : any isbool --> booleen
3458 type (booleantype) cvn eq
3461 %%%%% ### isarray ###
3462 %% syntaxe : any isarray --> booleen
3464 type (arraytype) cvn eq
3467 %%%%% ### isstring ###
3468 %% syntaxe : any isstring --> booleen
3470 type (stringtype) cvn eq
3473 %%%%% ### isinteger ###
3474 %% syntaxe : any isinteger --> booleen
3476 type (integertype) cvn eq
3480 %% syntaxe : any isnum --> booleen
3486 %%%%% ### isreal ###
3487 %% syntaxe : any isreal --> booleen
3489 type (realtype) cvn eq
3493 %% syntaxe : A B eqp3d --> booleen = true si les points A et B sont identiques
3495 %% x1 y1 z1 x2 y2 z2
3496 4 -1 roll %% x1 y1 x2 y2 z2 z1
3500 pop pop pop pop false
3504 %% syntaxe : A B eqp --> booleen = true si les points A et B sont identiques
3518 %% syntaxe : z z' eqc --> true si z = z', false sinon
3523 %%%%% ### eqstring ###
3528 str1 length str2 length eq {
3532 str1 i get str2 i get eq and
3541 %%%%% ### fin insertion ###
3543 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3544 %%%% conversions de types %%%%
3545 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3547 %%%%% ### astr2str ###
3548 %% syntaxe : array str astr2str --> str
3549 %% convertit le contenu de array en chaines de caracteres puis les
3550 %% concatene avec str, en inserant un caractere "space" apres chaque
3551 %% element du tableau array
3560 table 0 n 1 sub getinterval
3561 table n 1 sub get ( ) cvs
3569 %%%%% ### numstr2array ###
3570 %% syntaxe : str str2num --> num
3594 i 1 ge signnum 0 ge and i 2 ge or {
3595 exch 10 mul 48 sub add
3611 /str2num {cvx exec} def
3613 %% syntaxe : str numstr2array -> array
3614 %% ou str est une chaine de nombres reels separes par des espaces
3615 %% et array est constitue des elements numeriques de string.
3617 %% (0 -12 .234 54) --> [0 -12 0.234 54]
3628 /separateurs [separateurs aload pop i] def
3633 0 1 separateurs length 1 sub {
3635 str j separateurs i get oldsep sub getinterval str2num
3636 /j separateurs i get 1 add def
3637 /oldsep separateurs i get 1 add def
3639 str j n oldsep sub getinterval str2num
3644 %% syntaxe : array numstr2array -> array
3645 /arraynumstr2arrayarray {
3646 {numstr2array} apply
3649 %%%%% ### fin insertion ###
3651 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3652 %%%% macros de projection %%%%
3653 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3655 %%%%% ### projtext ###
3656 %% syntaxe : str x0 y0 z0 [normal_vect] ultextp3d --> -
3657 %% syntaxe : str x0 y0 z0 [normal_vect] bool ultextp3d --> -
3658 %% syntaxe : str x0 y0 plantype ultextp3d --> -
3659 %% syntaxe : str x0 y0 plantype bool ultextp3d --> -
3660 %% syntaxe : str1 solid i str2 ultextp3d --> -
3661 %% syntaxe : str1 solid i str2 bool ultextp3d --> -
3662 %% syntaxe : str1 solid i alpha str2 bool ultextp3d --> -
3671 /type_plan_proj true def
3673 lepl@n plangetbase aload pop
3676 lepl@n plangetorigine
3680 /table [@U @U @V vectprod3d] def
3683 %% c est un planprojpath
3684 /type_plan_proj true def
3691 %% c est un solidprojpath
3692 /type_plan_proj false def
3699 %% y a-t-il un alpha
3700 2 copy pop issolid {
3713 x0 y0 z0 table mybool projpath
3715 solid i alpha str2 mybool projpath
3722 %% syntaxe : str x0 y0 z0 [normal_vect] ultextp3d --> -
3723 %% syntaxe : str x0 y0 z0 [normal_vect] bool ultextp3d --> -
3724 %% syntaxe : str1 solid i str2 ultextp3d --> -
3725 %% syntaxe : str1 solid i str2 bool ultextp3d --> -
3726 %% syntaxe : str1 solid i alpha str2 bool ultextp3d --> -
3727 /ultextp3d {initpr@jtext ultext_ closepr@jtext} def
3728 /cltextp3d {initpr@jtext cltext_ closepr@jtext} def
3729 /bltextp3d {initpr@jtext bltext_ closepr@jtext} def
3730 /dltextp3d {initpr@jtext dltext_ closepr@jtext} def
3731 /ubtextp3d {initpr@jtext ubtext_ closepr@jtext} def
3732 /cbtextp3d {initpr@jtext cbtext_ closepr@jtext} def
3733 /bbtextp3d {initpr@jtext bbtext_ closepr@jtext} def
3734 /dbtextp3d {initpr@jtext dbtext_ closepr@jtext} def
3735 /uctextp3d {initpr@jtext uctext_ closepr@jtext} def
3736 /cctextp3d {initpr@jtext cctext_ closepr@jtext} def
3737 /bctextp3d {initpr@jtext bctext_ closepr@jtext} def
3738 /dctextp3d {initpr@jtext dctext_ closepr@jtext} def
3739 /urtextp3d {initpr@jtext urtext_ closepr@jtext} def
3740 /crtextp3d {initpr@jtext crtext_ closepr@jtext} def
3741 /brtextp3d {initpr@jtext brtext_ closepr@jtext} def
3742 /drtextp3d {initpr@jtext drtext_ closepr@jtext} def
3744 %%%%% ### currentppathtransform ###
3745 %% syntaxe : {f} currentppathtransform --> applique la transformation f
3746 %% au chemin courant
3747 /currentppathtransform {
3750 %% pour remplacer 'move'
3759 %% pour remplacer 'lineto'
3764 %% pour remplacer 'curveto'
3773 { warpmove } { warpline } { warpcurve } { closepath } pathforall
3778 %% syntaxe : {f} currentpathtransform --> applique la transformation f
3779 %% au chemin courant
3780 /currentpathtransform {
3783 /warp {ptojpoint transform} def
3784 %% pour remplacer 'move'
3793 %% pour remplacer 'lineto'
3798 %% pour remplacer 'curveto'
3807 { warpmove } { warpline } { warpcurve } { closepath } pathforall
3812 %%%%% ### normalvect_to_orthobase ###
3813 %% syntaxe : [normal_vect] normalvect_to_orthobase
3815 /normalvect_to_orthobase {
3818 aload pop normalize3d /normal_vect defpoint3d
3819 normal_vect -1 0 0 eqp3d {
3820 /imageI {0 -1 0} def
3821 /imageK {-1 0 0} def
3824 %% on calcule l image de la base (I,J,K)
3825 /imageJ {normal_vect 1 0 0 vectprod3d normalize3d} def
3826 /imageK {normal_vect} def
3827 /imageI {imageJ imageK vectprod3d} def
3828 1 0 0 imageK angle3d 0 eq {
3829 0 1 0 normal_vect vectprod3d /imageI defpoint3d
3831 normal_vect /imageK defpoint3d
3837 normalize3d /imageK defpoint3d
3838 normalize3d /imageI defpoint3d
3839 imageK imageI vectprod3d /imageJ defpoint3d
3843 /alpha exch 2 div def
3844 normalize3d /imageK defpoint3d
3845 normalize3d /imageI defpoint3d
3846 imageK imageI vectprod3d /imageJ defpoint3d
3847 %% et ensuite, on fait tourner la base autour de imageK
3848 imageI alpha cos mulv3d
3849 imageJ alpha sin mulv3d
3852 imageI alpha sin neg mulv3d
3853 imageJ alpha cos mulv3d
3862 normalize3d /normal_vect defpoint3d
3864 normal_vect -1 0 0 eqp3d {
3865 /imageI {0 -1 0} def
3866 /imageK {-1 0 0} def
3869 %% on calcule l image de la base (I,J,K)
3870 /imageJ {normal_vect 1 0 0 vectprod3d normalize3d} def
3871 /imageK {normal_vect} def
3872 /imageI {imageJ imageK vectprod3d} def
3873 1 0 0 imageK angle3d 0 eq {
3874 0 1 0 normal_vect vectprod3d /imageI defpoint3d
3876 normal_vect /imageK defpoint3d
3881 %% et ensuite, on fait tourner la base autour de imageK
3882 imageI alpha cos mulv3d
3883 imageJ alpha sin mulv3d
3886 imageI alpha sin neg mulv3d
3887 imageJ alpha cos mulv3d
3900 %%%%% ### projpath ###
3901 %% syntaxe : x y z [normal] projpath --> planprojpath
3902 %% syntaxe : x y z [normal] bool projpath --> planprojpath
3903 %% syntaxe : solid i projpath --> solidprojpath
3904 %% syntaxe : solid i bool projpath --> solidprojpath
3905 %% syntaxe : solid i str bool projpath --> solidprojpath
3906 %% syntaxe : solid i alpha str bool projpath --> solidprojpath
3917 lepl@n plangetbase aload pop
3920 lepl@n plangetorigine
3921 [@U @U @V vectprod3d] mybool planprojpath
3927 mybool solidprojpath
3934 %% %% syntaxe : x y z [normal] projpath --> planprojpath
3935 %% %% syntaxe : x y z [normal] bool projpath --> planprojpath
3936 %% %% syntaxe : solid i projpath --> solidprojpath
3937 %% %% syntaxe : solid i bool projpath --> solidprojpath
3938 %% %% syntaxe : solid i str bool projpath --> solidprojpath
3939 %% %% syntaxe : solid i alpha str bool projpath --> solidprojpath
3948 %% mybool planprojpath
3950 %% mybool solidprojpath
3955 %% syntaxe : solid i str bool solidprojpath --> -
3957 %% syntaxe : solid i alpha str bool solidprojpath --> -
3958 %% projette le chemin courant sur la face i du solide, apres
3959 %% eventuellement une rotation d angle alpha autour de la normale
3960 %% bool : pour savoir si on tient compte de la visibilite
3963 /visibility exch def
3976 (Error : mauvais type d argument dans solidprojpath) ==
3978 /n solid solidnombrefaces def
3980 visibility not solid i solidfacevisible? or {
3981 currentdict /option known {
3984 solid i solidcentreface
3987 solid 0 i solidgetsommetface
3988 solid 1 i solidgetsommetface
3989 vecteur3d normalize3d
3990 solid i solidnormaleface alpha
3991 ] false planprojpath
3996 (Error : indice trop grand dans solidprojpath) ==
4002 %% syntaxe : x y z [normal] bool planprojpath
4005 /visibility exch def
4006 %% on calcule l image de la base (I,J,K)
4007 normalvect_to_orthobase
4015 visibility not x y z imageK planvisible? or {
4022 3dto2d jtoppoint} currentppathtransform
4029 %%%%% ### projscene ###
4030 %% syntaxe : plantype bool bprojscene ... eprojscene
4040 /saveStroke {SolidesDict /Stroke get exec} def
4041 /Stroke {l@pl@n mybool projpath saveStroke} def
4042 /savefill {SolidesDict /Fill get exec} def
4043 /Fill {l@pl@n mybool projpath savefill} def
4045 l@pl@n plangetrange aload pop
4048 %% xmin ymin l@pl@n pointplan smoveto
4049 %% xmin ymax l@pl@n pointplan slineto
4050 %% xmax ymax l@pl@n pointplan slineto
4051 %% xmax ymin l@pl@n pointplan slineto
4052 %% xmin ymin l@pl@n pointplan smoveto
4054 %% %gsave orange fill grestore
4062 %%%%% ### fin insertion ###
4064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4065 %%%% fonctions numeriques %%%%
4066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4068 %%%%% ### courbeparam ###
4070 /resolution exch def
4074 /courbe_dic 2 dict def
4075 courbe_dic /X {} put
4076 courbe_dic /Y {} put
4078 %% syntaxe : tmin tmax C@urbeparam_
4084 /dt tmax@ tmin@ sub resolution 1 sub div def
4085 tmin@ courbe_dic /X get exec
4087 tmin@ courbe_dic /Y get exec
4092 t courbe_dic /X get exec
4094 t courbe_dic /Y get exec
4098 /t t dt add store %% on incremente
4101 tmax@ courbe_dic /X get exec
4103 tmax@ courbe_dic /Y get exec
4109 %% syntaxe : tmin tmax {X} {Y} Courbeparam_
4111 courbe_dic exch /Y exch put
4112 courbe_dic exch /X exch put
4116 %% syntaxe : {X} {Y} courbeparam_
4124 %% syntaxe : tmin tmax {X} {Y} Courbeparam
4133 courbe_dic exch /Y exch put
4134 courbe_dic exch /X exch put
4139 tmin courbe_dic /X get exec
4141 tmin courbe_dic /Y get exec
4143 smoveto %% on commence le chemin
4144 tmin tmax C@urbeparam_
4149 currentdict /option known
4151 /dt tmax tmin sub resolution 1 sub div def
4152 tmin dt add courbe_dic /X get exec
4153 tmin dt add courbe_dic /Y get exec
4154 tmin courbe_dic /X get exec
4155 tmin courbe_dic /Y get exec
4157 tmax dt sub courbe_dic /X get exec
4158 tmax dt sub courbe_dic /Y get exec
4159 tmax courbe_dic /X get exec
4160 tmax courbe_dic /Y get exec
4161 currentdict /dt undef
4168 currentlinewidth 0 eq {} {Stroke} ifelse
4174 %% syntaxe : {X} {Y} courbeparam
4192 %% syntaxe : tmin tmax {X} {Y} Courbeparam*
4195 /startest {true} def
4200 %% syntaxe : {X} {Y} courbeparam*
4203 /startest {true} def
4208 %%%%% ### courbe ###
4209 %% syntaxe : {f} courbe
4211 dup isstring %% y a-t-il une option de fin de ligne ?
4227 %% syntaxe : mini maxi {f} Courbe
4240 %% syntaxe : {f} courbe_
4248 %% syntaxe : mini maxi {f} Courbe_
4255 %% syntaxe : mini maxi {f} Courbe*
4258 /startest {true} def
4263 %% syntaxe : {f} courbe*
4266 /startest {true} def
4271 %%%%% ### courbeR2 ###
4272 %% syntaxe : tmin tmax C@urbeR2_
4278 /dt tmax@ tmin@ sub resolution 1 sub div def
4279 tmin@ courbe_dic /X get exec
4285 t courbe_dic /X get exec
4288 /t t dt add store %% on incremente
4291 tmax@ courbe_dic /X get exec
4297 %% syntaxe : tmin tmax {X} CourbeR2_
4299 courbe_dic exch /X exch put
4303 %% syntaxe : {X} courbeR2_
4311 %% syntaxe : tmin tmax {X} CourbeR2
4328 courbe_dic exch /X exch put
4335 currentlinewidth 0 eq {} {Stroke} ifelse
4341 %% syntaxe : {X} courbeR2
4348 %% syntaxe : tmin tmax {X} CourbeR2*
4351 /startest {true} def
4356 %% syntaxe : {X} {Y} courbeR2*
4359 /startest {true} def
4364 %%%%% ### courbeR3 ###
4365 %% syntaxe : t1 t2 {f} (option) CourbeR3
4371 /lafonction exch def
4373 currentdict /option known
4380 %% syntaxe : {f} (option) CourbeR3
4382 tmin tmax 3 -1 roll CourbeR3
4385 %%%%% ### cercle ###
4386 %% syntaxe : x0 y0 r cercle
4392 0 360 {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} Courbeparam
4396 %% syntaxe : x0 y0 r cercle_
4402 x@ r@y@n add y@ smoveto
4403 0 360 {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} Courbeparam_
4407 %% syntaxe : x0 y0 r cercle-_
4413 x@ r@y@n add y@ smoveto
4414 360 0 {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} Courbeparam_
4418 %% syntaxe : x0 y0 r cercle*
4426 %% syntaxe : alpha beta x0 y0 r Cercle
4435 {cos r@y@n mul x@ add} {sin r@y@n mul y@ add}
4436 currentdict /option known
4443 %% syntaxe : alpha beta x0 y0 r Cercle_
4449 {cos r@y@n mul x@ add} {sin r@y@n mul y@ add} Courbeparam_
4453 %% syntaxe : alpha beta x0 y0 r Cercle
4456 /startest {true} def
4461 %%%%% ### fin insertion ###
4463 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4464 %%%% fonctions et constantes mathematiques %%%%
4465 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4468 %%%%%%%%%%% constantes mathematiques %%%%%%%%%%%%%%
4473 %%%%%%%%%%% fonctions mathematiques %%%%%%%%%%%%%%%
4475 /rd {180 pi div mul} def %% transforme des rd en degres
4476 /deg {pi mul 180 div} def %% transforme des degres en rd
4477 /log {ln 10 ln div} def
4478 /Exp {e exch exp} def
4481 /tan {dup sin exch cos div} def
4482 /cotan {dup cos exch sin div} def
4483 /Tan {dup Sin exch Cos div} def
4484 /Cotan {dup Cos exch Sin div} def
4492 /Arctan {arctan deg} def
4495 dup mul neg 1 add sqrt
4499 /Arccos {arccos deg} def
4505 dup mul neg 1 add sqrt
4513 /Arcsin {arcsin deg} def
4514 /cosh {dup Exp exch neg Exp add 2 div} def
4515 /sinh {dup Exp exch neg Exp sub 2 div} def
4516 /tanh {dup sinh exch cosh div} def
4517 /cotanh {dup cosh exch sinh div} def
4518 /argcosh {dup dup mul 1 sub sqrt add ln} def
4519 /argsinh {dup dup mul 1 add sqrt add ln} def
4531 {dup 1 sub factorielle mul}
4539 x m sub dup mul sigma dup mul 2 mul div neg Exp
4540 2 pi mul sigma dup mul mul sqrt div
4543 %% syntaxe : a n modulo
4570 duparray /table exch def pop
4572 1 1 table length 1 sub {
4585 %%%%% ### setcolor ###
4586 %% syntaxe : tableau setcolor
4589 {aload pop setcmykcolor}
4590 {aload pop setrgbcolor}
4595 %% cherche si un elt donne appartient au tableau donne
4596 %% rque : utilise 3 variables locales
4597 %% syntaxe : elt array in --> index boolean
4603 false %% la reponse a priori
4605 liste i get elt eq {
4606 pop %% en enleve la reponse
4607 i true %% pour mettre la bonne
4615 %% cherche si un elt donne appartient au tableau donne
4616 %% syntaxe : elt array in --> boolean
4622 false %% la reponse a priori
4624 liste i get elt eq {
4625 pop %% en enleve la reponse
4626 true %% pour mettre la bonne
4634 %%%%% ### starfill ###
4635 %% la procedure pour les objets "star"
4636 %% si c est "star" on fait le fillstyle, sinon non
4648 %% syntaxe : u v addv --> u+v
4649 /addv { %% xA yA xB yB
4650 3 1 roll %% xA yB yA xB
4651 4 1 roll %% xB xA yB yA
4652 add 3 1 roll %% yB+yA xB xA
4656 %%%%% ### continu ###
4661 %%%%% ### trigospherique ###
4662 %% passage spherique --> cartesiennes
4663 %% les formules de passage ont été récupérées ici :
4664 %% http://fr.wikipedia.org/wiki/Coordonn%C3%A9es_polaires
4665 %% syntaxe : r theta phi rtp2xyz -> x y z
4671 /x phi cos theta cos mul r mul def
4672 /y phi cos theta sin mul r mul def
4673 /z phi sin r mul def
4678 %% trace d'un arc sur une sphere de centre O
4679 %% syntaxe : r theta1 phi1 r theta2 phi2 arcspherique
4693 1 theta1 phi1 rtp2xyz /u defpoint3d
4694 1 theta2 phi2 rtp2xyz /v defpoint3d
4695 u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
4697 /sinalpha u v vectprod3d norme3d def
4698 /cosalpha u v scalprod3d def
4699 /alpha sinalpha cosalpha atan def
4701 /pas alpha n div def
4708 u t cos r mul mulv3d
4709 w t sin r mul mulv3d
4713 currentdict /option known {
4721 %% trace d'un arc sur une sphere de centre O
4722 %% syntaxe : r theta1 phi1 r theta2 phi2 arcspherique
4733 1 theta1 phi1 rtp2xyz /u defpoint3d
4734 1 theta2 phi2 rtp2xyz /v defpoint3d
4735 u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
4737 /sinalpha u v vectprod3d norme3d def
4738 /cosalpha u v scalprod3d def
4739 /alpha sinalpha cosalpha atan def
4741 /pas alpha n div def
4747 u t cos r mul mulv3d
4748 w t sin r mul mulv3d
4755 %% trace d'une geodesique sur une sphere de centre O
4756 %% syntaxe : r theta1 phi1 r theta2 phi2 geodesique_sphere
4757 /geodesique_sphere {
4767 1 theta1 phi1 rtp2xyz /u defpoint3d
4768 1 theta2 phi2 rtp2xyz /v defpoint3d
4769 u v vectprod3d u vectprod3d dupp3d norme3d 1 exch div mulv3d /w defpoint3d
4771 /sinalpha u v vectprod3d norme3d def
4772 /cosalpha u v scalprod3d def
4773 /alpha sinalpha cosalpha atan def
4781 u t cos r mul mulv3d
4782 w t sin r mul mulv3d
4791 %% syntaxe : A B C trianglespherique --> trace le rtiangle ABC
4792 %% (coordonnees spheriques)
4793 /trianglespherique* {
4795 /startest {true} def
4800 /trianglespherique {
4807 A rtp2xyz 3dto2d smoveto
4813 currentlinewidth 0 eq {} {Stroke} ifelse
4818 %%%%% ### fin insertion ###
4820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4821 %%%% operations sur les tableaux %%%%
4822 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4824 %%%%% ### duparray ###
4833 %%%%% ### append ###
4834 %% syntaxe : string1 string2 append --> concatene les 2 chaines ou fusionne 2 tableaux
4840 [ tab1 aload pop tab2 aload pop ]
4844 /result str1 length str2 length add string def
4845 str1 result copy pop
4846 result str1 length str2 putinterval
4852 %%%%% ### rollparray ###
4853 %% syntaxe : array n rollparray -> array
4854 %% opere une rotation de n sur les couplets du tableau array
4864 [ table aload pop 2 {n 1 roll} repeat ]
4867 [ table aload pop 2 {n -1 roll} repeat ]
4875 %%%%% ### bubblesort ###
4876 %% syntaxe : array bubblesort --> array2 trie par ordre croissant
4877 %% code de Bill Casselman
4878 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
4882 /n a length 1 sub def
4884 % at this point only the n+1 items in the bottom of a remain to
4885 % the sorted largest item in that blocks is to be moved up into
4890 a i get a i 1 add get gt {
4891 % if a[i] > a[i+1] swap a[i] and a[i+1]
4895 % set new a[i] = old a[i+1]
4897 % set new a[i+1] = old a[i]
4908 %% syntaxe : array1 doublebubblesort --> array2 array3, array3 est
4909 %% trie par ordre croissant et array2 correspond a la position des
4910 %% indices de depart, ie si array1 = [3 2 4 1], alors array2 = [3 1 0 2]
4911 %% code de Bill Casselman, modifie par jpv, 15/08/2006
4912 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
4916 /n table length 1 sub def
4917 /indices [ 0 1 n {} for ] def
4919 % at this point only the n+1 items in the bottom of a remain to
4920 % the sorted largest item in that blocks is to be moved up into
4925 table i get table i 1 add get gt {
4926 % if a[i] > a[i+1] swap a[i] and a[i+1]
4929 table i table i 1 add get
4930 % set new a[i] = old a[i+1]
4932 % set new a[i+1] = old a[i]
4937 indices i indices i 1 add get
4938 % set new a[i] = old a[i+1]
4940 % set new a[i+1] = old a[i]
4951 %%%%% ### quicksort ###
4952 %% src : http://www.math.ubc.ca/~cass/graphics/text/www/code/sort.inc
4953 %% code de Bill Casselman, modifie par jpv, 18/10/2007
4955 /qsortdict 8 dict def
4959 % args: /comp a L R x
4960 % effect: effects a partition into two pieces [L j] [i R]
4961 % leaves i j on stack
4963 /partition { 8 dict begin
4971 a i get x comp exec not {
4977 x a j get comp exec not {
4988 indices j indices i get
4989 indices i indices j get
5002 % effect: sorts a[L .. R] according to comp
5007 % /c a [L R] /c a [L R]
5009 % /c a [L R] /c a L R L R
5011 % /c a [L R] /c a L R (L+R)/2
5013 % /c a [L R] /c a L R x
5016 % if j > L subsort(a, L, j)
5022 % /c a [L R] i j /c a [L R] i j
5024 % /c a [L R] i j /c a [L R] j
5032 % if i < R subsort(a, i, R)
5046 % effect: sorts the array a
5047 % comp returns truth of x < y for entries in a
5049 /quicksort { qsortdict begin
5062 % ----------------------------------------
5064 %% fin du code de Bill Casselman
5066 %% syntaxe : array1 doublebubblesort --> array2 array3, array3 est
5067 %% trie par ordre croissant et array2 correspond a la position des
5068 %% indices de depart, ie si array1 = [3 2 4 1], alors array2 = [3 1 0 2]
5069 %% code de Bill Casselman, modifie par jpv, 18/10/2007
5070 %% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/
5075 a dup length /n exch def
5076 /indices [0 1 n 1 sub {} for ] def
5094 %% syntaxe : [x1 ... xn] (f) apply --> [f(x1) ... f(xn)]
5098 {/fonction exch cvx def}
5099 {/fonction exch def}
5105 liste @i get fonction
5116 %% syntaxe : [x1 ... xn] (f) papply
5120 {/fonction exch cvx def}
5121 {/fonction exch def}
5126 liste length 2 idiv {
5140 %% syntaxe : [x1 ... xn] (f) capply
5144 {/fonction exch cvx def}
5145 {/fonction exch def}
5150 liste length 3 idiv {
5165 %%%%% ### reverse ###
5166 %% syntaxe : array reverse --> inverse l ordre des items dans
5170 /le_tableau exch def
5171 /n le_tableau length def
5182 %% syntaxe : array_points reversep --> inverse l ordre des points dans
5186 /le_tableau exch def
5187 /n le_tableau length 2 idiv def
5199 %% syntaxe : array_points n getp --> le n-ieme point du tableau de
5200 %% points array_points
5208 %%%%% ### fin insertion ###
5210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5212 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5214 %%%%% ### linear ###
5215 %% syntaxe : M i j any --> depose any dans M en a_ij
5228 %% syntaxe : M i j get_ij --> le coeff c_ij
5235 %% syntaxe : M i L put_Li --> remplace dans M la ligne Li par L
5240 %% syntaxe : M i get_Li --> la ligne Li de M
5245 %%%%% ### fin insertion ###
5247 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5248 %%%% geometrie 3d (calculs) %%%%
5249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5251 %%%%% ### sortp3d ###
5288 %%%%% ### dupp3d ###
5289 %% duplique le vecteur 3d
5293 /dupv3d {dupp3d} def
5295 %%%%% ### angle3d ###
5296 %% syntaxe : vect1 vect2 angle3d
5299 normalize3d /vect2 defpoint3d
5300 normalize3d /vect1 defpoint3d
5301 /cosalpha vect1 vect2 scalprod3d def
5302 /sinalpha vect1 vect2 vectprod3d norme3d def
5303 sinalpha cosalpha atan
5307 %%%%% ### transformpoint3d ###
5308 %% syntaxe : x y z a11 a21 a31 a12 a22 a32 a13 a23 a33
5309 %% transformpoint3d -> X Y Z
5324 a11 x mul a12 y mul add a13 z mul add
5325 a21 x mul a22 y mul add a23 z mul add
5326 a31 x mul a32 y mul add a33 z mul add
5330 %%%%% ### normalize3d ###
5331 %% rend le vecteur 3d unitaire. Ne fait rien si u=0
5332 /unitaire3d { %% x y z
5335 /norme u norme3d def
5339 u 1 norme div mulv3d
5343 /normalize3d {unitaire3d} def
5345 %%%%% ### geom3d ###
5346 %% syntaxe : A k1 B k2 barycentre3d -> G, barycentre du systeme
5347 %% [(A, k1) (B, k2)]
5357 1 k1 k2 add div mulv3d
5361 %% syntaxe : array isobarycentre3d --> G
5365 /n table length 3 idiv def
5375 %% syntaxe : M A alpha hompoint3d -> le point M' tel que AM' = alpha AM
5381 A M vecteur3d alpha mulv3d A addv3d
5385 %% syntaxe : M A sympoint3d -> le point M' tel que AM' = -AM
5390 A M vecteur3d -1 mulv3d A addv3d
5394 %% syntaxe : A u translatepoint3d --> B image de A par la translation de vecteur u
5413 % syntaxe : M alpha_x alpha_y alpha_z rotateOpoint3d --> M'
5422 /c1 {RotX cos} bind def
5423 /c2 {RotY cos} bind def
5424 /c3 {RotZ cos} bind def
5425 /s1 {RotX sin} bind def
5426 /s2 {RotY sin} bind def
5427 /s3 {RotZ sin} bind def
5428 /M11 {c2 c3 mul} bind def
5429 /M12 {c3 s1 mul s2 mul c1 s3 mul sub} bind def
5430 /M13 {c1 c3 mul s2 mul s1 s3 mul add} bind def
5431 /M21 {c2 s3 mul} bind def
5432 /M22 {s1 s2 mul s3 mul c1 c3 mul add} bind def
5433 /M23 {s3 s2 mul c1 mul c3 s1 mul sub} bind def
5434 /M31 {s2 neg} bind def
5435 /M32 {s1 c2 mul} bind def
5436 /M33 {c1 c2 mul} bind def
5437 M11 Xpoint mul M12 Ypoint mul add M13 Zpoint mul add
5438 M21 Xpoint mul M22 Ypoint mul add M23 Zpoint mul add
5439 M31 Xpoint mul M32 Ypoint mul add M33 Zpoint mul add
5443 %%%%% ### symplan3d ###
5444 %% syntaxe : M eqplan/plantype symplan3d --> M'
5445 %% ou M' symetrique de M par rapport au plan P defini par eqplan/plantype
5449 plan2eq /args exch def
5461 /n_U a1 dup mul b1 dup mul add c1 dup mul add sqrt def
5466 /u a x mul b y mul add c z mul add d add def
5473 %%%%% ### vecteur3d ###
5474 %% creation du vecteur AB a partir de A et B
5475 /vecteur3d { %% xA yA zA xB yB zB
5489 %%%%% ### vectprod3d ###
5490 %% produit vectoriel de deux vecteurs 3d
5491 /vectprod3d { %% x1 y1 z1 x2 y2 z2
5499 y zp mul z yp mul sub
5500 z xp mul x zp mul sub
5501 x yp mul y xp mul sub
5505 %%%%% ### scalprod3d ###
5506 %% produit scalaire de deux vecteurs 3d
5507 /scalprod3d { %% x1 y1 z1 x2 y2 z2
5515 x xp mul y yp mul add z zp mul add
5519 %%%%% ### papply3d ###
5520 %% syntaxe : [A1 ... An] (f) papply3d --> [f(A1) ... f(An)]
5527 liste length 3 idiv {
5542 %%%%% ### defpoint3d ###
5543 %% creation du point A a partir de xA yA yB et du nom /A
5544 /defpoint3d { %% xA yA zA /nom
5547 [ 4 1 roll ] cvx memo exch
5551 %%%%% ### distance3d ###
5552 /distance3d { %% A B
5557 /getp3d { %% [tableau de points 3d] i --> donne le ieme point du tableau
5566 %%%%% ### norme3d ###
5567 %% norme d un vecteur 3d
5573 x dup mul y dup mul add z dup mul add sqrt
5577 %%%%% ### mulv3d ###
5578 %% (scalaire)*(vecteur 3d) Attention : dans l autre sens !
5579 /mulv3d { %% x y z lambda
5591 %%%%% ### addv3d ###
5592 %% addition de deux vecteurs 3d
5593 /addv3d { %% x1 y1 z1 x2 y2 z2
5607 %%%%% ### milieu3d ###
5608 /milieu3d { %% A B --> I le milieu de [AB]
5623 4 {8 -1 roll} repeat
5631 %%%%% ### ABpoint3d ###
5632 %% syntaxe : A B k ABpoint3d --> M
5633 %% M tel que vect(AM) = k vect (AB)
5645 %%%%% ### angle3doriente ###
5646 %% syntaxe : vect1 vect2 vect3 angle3d
5647 %% vect3 est la normale au plan (vect1, vect2)
5650 normalize3d /vect3 defpoint3d
5651 normalize3d /vect2 defpoint3d
5652 normalize3d /vect1 defpoint3d
5653 /cosalpha vect1 vect2 scalprod3d def
5654 /sinalpha vect1 vect2 vectprod3d vect3 scalprod3d def
5655 sinalpha cosalpha atan
5659 %%%%% ### points3dalignes ###
5660 %% syntaxe : A B C points3dalignes -> bool
5666 A B vecteur3d /u defpoint3d
5667 A C vecteur3d /v defpoint3d
5668 u v vectprod3d norme3d 1E-7 lt
5672 %% syntaxe : M A B point3dsursegment --> true si M in [AB], false sinon
5673 /point3dsursegment {
5678 M A B points3dalignes {
5692 %%%%% ### fin insertion ###
5694 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5695 %%%% geometrie 3d (dessins) %%%%
5696 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5698 %%%%% ### point3d ###
5703 /points3d { %% tableau de points3d
5707 %%%%% ### ligne3d ###
5708 %% [tableau de points3d] option --> trace la ligne brisee
5715 currentdict /option known
5722 %% [tableau de points3d] option --> trace la ligne brisee
5729 currentdict /option known
5736 %%%%% ### tab3dto2d ###
5737 %% transforme un tableau de points 3d en tableau de points 2d
5743 n 1 sub -1 n 3 idiv 2 mul
5751 %%%%% ### polygone3d ###
5752 /polygone3d { %% tableau de points3d
5756 /polygone3d* { %% tableau de points3d
5760 %%%%% ### fin insertion ###
5762 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5763 %%%% gestion du texte %%%%
5764 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5767 /xmkstep 1 def % les marques sur Ox
5768 /xmarkstyle {dctext} def
5769 /ymarkstyle {(-1 0) bltext} def
5775 /Courier findfont .8 fontsize mul scalefont setfont
5776 dup dup truncate eq {
5777 cvi dup chaine cvs exch
5785 /n xmax xmax xmin sub 1000 div sub xmkstep div truncate cvi
5786 xmkstep mul def % mark max
5787 /i xmin xmkstep div truncate cvi
5788 xmkstep mul def % la 1ere
5789 i xmin lt {/i i xmkstep add store} if
5792 /i i xmkstep abs add store
5798 /ymkstep 1 def % les marques sur Oy
5804 /Courier findfont .8 fontsize mul scalefont setfont
5810 /n ymax ymax ymin sub 1000 div sub ymkstep div truncate cvi
5811 ymkstep mul def % mark max
5812 /i ymin ymkstep div truncate cvi
5813 ymkstep mul def % la 1ere
5816 /i i ymkstep abs add store
5831 %%%%% ### setfontsize ###
5836 %%%%% ### setCourrier ###
5838 dup length dict begin
5845 /Encoding ISOLatin1Encoding def
5849 /Courier-ISOLatin1 exch definefont pop
5852 /Courier-ISOLatin1 findfont
5857 %%%%% ### pathtext ###
5858 %% syntaxe : string x y initp@thtext
5878 %% syntaxe : string x y cctext_
5881 llx wx add lly wy add -.5 mulv rmoveto
5901 hadjust neg 0 rmoveto
5909 wx llx add -.5 mul 0 rmoveto
5922 hadjust vadjust rmoveto
5923 llx neg lly neg rmoveto
5929 hadjust neg vadjust rmoveto
5930 wx neg lly neg rmoveto
5937 llx wx add -.5 mul lly neg rmoveto
5943 hadjust vadjust neg rmoveto
5944 llx neg wy neg rmoveto
5950 0 vadjust neg rmoveto
5957 hadjust neg vadjust neg rmoveto
5958 wx neg wy neg rmoveto
5964 0 vadjust neg rmoveto
5965 llx wx add -2 div wy neg rmoveto
5972 llx neg lly wy add -2 div rmoveto
5979 0 lly wy add -2 div rmoveto
5985 hadjust neg 0 rmoveto
5986 wx neg lly wy add -2 div rmoveto
5993 llx wx add lly wy add -.5 mulv rmoveto
5997 %%%%% ### text3d ###
5998 %%%% Version 3d des commandes jps TEXTE
6001 % /vect_echelle [1 1] def
6002 % /angle_de_rot {0} def
6004 % {/angle_de_rot exch def}
6007 % {/vect_echelle exch def}
6008 % if% CamView vect_echelle {angle_de_rot}
6204 %%%%% ### fin insertion ###
6206 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6207 %%%% bibliotheque sur les solides %%%%
6208 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6210 %%%%% ### solide ###
6211 %% solid = [Sommets Faces Colors_Faces InOut_Table]
6215 /solidgetpointstable {solidgetsommets} def
6232 %% syntaxe : solid i solidgetfcolor --> str
6236 solidgetfcolors i get
6240 %% syntaxe : solid i str solidputfcolor --> -
6245 solidgetfcolors i str put
6249 /solidgetinouttable {
6256 /solidputpointstable {solidputsommets} def
6262 %% syntaxe : solid solidfacesreverse -> -
6263 /solidfacesreverse {
6266 /n solid solidnombrefaces def
6269 /F solid i solidgetface reverse def
6271 solid i [F aload pop m 0 roll ] solidputface
6280 /solidputinouttable {
6284 %% syntaxe : any issolid --> booleen, vrai si any est de type solid
6289 candidat length 4 eq {
6290 candidat 0 get isarray
6291 candidat 1 get isarray and
6292 candidat 2 get isarray and
6293 candidat 3 get isarray and {
6294 /IO candidat 3 get def
6315 /S solid solidgetsommets def
6316 /F solid solidgetfaces def
6317 /FC solid solidgetfcolors def
6318 /IO solid solidgetinouttable def
6323 FC duparray exch pop
6324 IO duparray exch pop
6329 %% syntaxe : solid array solidputinfaces --> -
6332 /facesinternes exch def
6334 /n2 facesinternes length def
6335 /IO solid solidgetinouttable def
6336 /facesexternes solid solidgetoutfaces def
6337 /n1 facesexternes length def
6339 [facesexternes aload pop facesinternes aload pop]
6344 IO 3 n1 n2 add 1 sub put
6348 %% syntaxe : solid array solidputoutfaces --> -
6351 /facesexternes exch def
6353 /n1 facesexternes length def
6354 /IO solid solidgetinouttable def
6355 /facesinternes solid solidgetinfaces def
6356 /n2 facesinternes length def
6358 [facesexternes aload pop facesinternes aload pop]
6363 IO 3 n1 n2 add 1 sub put
6367 /solidnombreinfaces {
6370 solid solidwithinfaces {
6371 /IO solid solidgetinouttable def
6372 IO 3 get IO 2 get sub 1 add
6379 /solidnombreoutfaces {
6382 /IO solid solidgetinouttable def
6383 IO 1 get IO 0 get sub 1 add
6387 %% syntaxe : solid solidgetinfaces --> array
6392 (Error : mauvais type d argument dans solidgetinfaces) ==
6395 solid solidwithinfaces {
6396 /IO solid solidgetinouttable def
6397 /F solid solidgetfaces def
6400 /n n2 n1 sub 1 add def
6408 %% syntaxe : solid solidgetoutfaces --> array
6413 (Error : mauvais type d argument dans solidgetoutfaces) ==
6416 /IO solid solidgetinouttable def
6417 /F solid solidgetfaces def
6420 /n n2 n1 sub 1 add def
6425 %% /tracelignedeniveau? false def
6426 %% /hauteurlignedeniveau 1 def
6427 %% /couleurlignedeniveau {rouge} def
6428 %% /linewidthlignedeniveau 4 def
6434 /solidgrid false def
6437 %% syntaxe : solid i string solidputfcolor
6438 %% syntaxe : solid str outputcolors
6439 %% syntaxe : solid str1 str2 inoutputcolors
6440 %% syntaxe : solid string n solidputncolors
6441 %% syntaxe : solid array solidputincolors --> -
6442 %% syntaxe : solid array solidputoutcolors --> -
6443 %% syntaxe : solid solidgetincolors --> array
6444 %% syntaxe : solid solidgetoutcolors --> array
6446 %% syntaxe : solid array solidputinfaces --> -
6447 %% syntaxe : solid array solidputoutfaces --> -
6448 %% syntaxe : solid solidgetinfaces --> array
6449 %% syntaxe : solid solidgetoutfaces --> array
6451 %% syntaxe : solid1 solid2 solidfuz -> solid
6453 %% syntaxe : solid i solidgetsommetsface -> array
6454 %% array = tableau de points 3d
6455 /solidgetsommetsface {
6459 /F solid i solidgetface def
6461 0 1 F length 1 sub {
6463 solid F k get solidgetsommet
6469 %% syntaxe : solid index table solidputface -> -
6474 solidgetfaces i table put
6478 %% syntaxe : solid table solidaddface -> -
6479 %% syntaxe : solid table (couleur) solidaddface -> -
6480 %% on ne se preoccupe pas des faces internes
6490 /IO solid solidgetinouttable def
6492 /FC solid solidgetoutcolors def
6494 solid [ solid solidgetfaces aload pop table ] solidputfaces
6495 solid IO solidputinouttable
6496 % solid solidnombrefaces
6498 FC aload pop lac@uleur
6506 solid solidnombreinfaces
6507 solid solidnombreoutfaces
6512 %% syntaxe : solid M solidaddsommetexterne -> -
6513 %% on ajoute le sommet sans se preoccuper de rien
6514 /solidaddsommetexterne {
6519 [ solid solidgetsommets aload pop M ]
6524 %% syntaxe : solid array solidaddsommets -> -
6529 /n table length 3 idiv def
6532 solid table i getp3d solidaddsommet pop
6537 %% syntaxe : solid M solidaddsommet -> k
6538 %% on ajoute le sommet M. Si il est deja sur une arete,
6539 %% on l incorpore a la face concernee
6540 %% s il est deja present, on ne le rajoute pas.
6541 %% Renvoie l indice du sommet rajoute.
6546 /nbf solid solidnombrefaces def
6547 /N solid solidnombresommets def
6549 %% le sommet est-il deja dans la structure
6553 %% solid i solidgetsommet == == ==
6555 %% solid i solidgetsommet M eqp3d ==
6557 % solid i solidgetsommet M eqp3d {
6558 solid i solidgetsommet M distance3d 1e-5 le {
6559 %% oui => c est fini
6564 %% non => on le rajoute
6566 solid M solidaddsommetexterne
6567 %% est il sur une arete deja codee
6571 solid i solidgetface /F exch def
6576 solid j i solidgetsommetface
6577 solid j 1 add nbsf mod i solidgetsommetface
6579 %% il est sur l arete concernee
6586 j 1 add nbsf mod dup 0 eq {
6604 %%%%% ### solidrmsommet ###
6605 %% syntaxe : solid i solidrmsommet -> -
6611 (Erreur : mauvais type d argument dans solidrmsommet) ==
6614 solid i solidsommetsadjsommet length 0 gt {
6615 (Erreur : sommet non isole dans solidrmsommet) ==
6619 %% on s occupe des sommets
6620 /n solid solidnombresommets def
6625 solid j solidgetsommet
6629 solid S solidputsommets
6630 %% on s occupe des faces
6631 /n solid solidnombrefaces def
6636 /Fj solid j solidgetface def
6637 [0 1 Fj length 1 sub {
6638 %% sommet d indice k de la face Fj
6646 solid F solidputfaces
6650 %%%%% ### solidsommetsadjsommet ###
6651 %% syntaxe : solid i solidsommetsadjsommet --> array
6652 %% array est le tableau des indices des sommets adjacents au
6653 %% sommet d indice i
6654 /solidsommetsadjsommet {
6658 solid no solidfacesadjsommet /facesadj exch def
6660 /nbadj facesadj length def
6663 %% examen de la jieme face
6665 /F solid facesadj j get solidgetface def
6666 /nbsommetsface F length def
6669 /i1 F index 1 sub nbsommetsface modulo get def
6670 /i2 F index 1 add nbsommetsface mod get def
6671 %% si i1 n est pas deja note, on le rajoute
6675 /sommetsadj [ sommetsadj aload pop i1 ] store
6677 %% si i2 n est pas deja note, on le rajoute
6681 /sommetsadj [ sommetsadj aload pop i2 ] store
6684 (Error : bug dans solidsommetsadjsommet) ==
6692 %%%%% ### solidfacesadjsommet ###
6693 %% syntaxe : solid i solidfacesadjsommet --> array
6694 %% array est le tableau des indices des faces adjacentes au
6695 %% sommet d indice i
6696 /solidfacesadjsommet {
6700 /n solid solidnombrefaces def
6701 /indicesfacesadj [] def
6704 /F solid j solidgetface def
6707 /indicesfacesadj [ indicesfacesadj aload pop j ] store
6714 %%%%% ### ordonnepoints3d ###
6715 %% syntaxe : array1 M ordonnepoints3d --> array2
6716 %% array1 = tableau de points 3d coplanaires (plan P)
6717 %% M = point3d indiquant la direction de la normale a P
6718 %% array2 = les indices des points de depart, ranges dans le
6719 %% sens trigo par rapport a la normale
6724 table isobarycentre3d /G defpoint3d
6725 %% calcul de la normale
6726 table 0 getp3d /ptref defpoint3d
6727 table 1 getp3d /A defpoint3d
6730 vectprod3d /vecteurnormal defpoint3d
6731 vecteurnormal G M vecteur3d scalprod3d 0 lt {
6732 vecteurnormal -1 mulv3d /vecteurnormal defpoint3d
6734 %% la table des angles
6735 table duparray exch pop
6740 vecteurnormal angle3doriente
6742 % [0 1 table length 3 idiv 1 sub {} for]
6744 doublebubblesort pop
6748 %%%%% ### fin insertion ###
6750 %% /tracelignedeniveau? false def
6751 %% /hauteurlignedeniveau 1 def
6752 %% /couleurlignedeniveau {rouge} def
6753 %% /linewidthlignedeniveau 4 def
6755 %% /solidgrid true def
6756 %% /aretescachees true def
6757 %% /defaultsolidmode 2 def
6759 %% syntaxe : alpha beta r h newpie --> solid
6762 [[/resolution /nbetages] [8 1] [10 1] [12 1] [18 3] [36 5]] gestionsolidmode
6769 % alpha cos r mul alpha sin r mul
6770 alpha beta {1 dict begin /t exch def t cos r mul t sin r mul end} CourbeR2+
6771 ] 0 h [nbetages] newprismedroit
6775 %%%%% ### newsolid ###
6776 %% syntaxe : newsolid --> depose le solide nul sur la pile
6781 %%%%% ### generesolid ###
6786 [S F [F length {()} repeat] [0 F length 1 sub -1 -1]]
6790 %%%%% ### nullsolid ###
6791 %% syntaxe : solide nullsolid -> booleen, vrai si le solide est nul
6795 candidat issolid not {
6796 (Error type argument dans "nullsolid") ==
6799 candidat solidgetsommets length 0 eq {
6807 %%%%% ### solidnombreoutfaces ###
6808 /solidnombreoutfaces {
6812 (Error : mauvais type d argument dans solidnombreoutfaces) ==
6818 /IO solid solidgetinouttable def
6826 %%%%% ### solidnombreinfaces ###
6827 /solidnombreinfaces {
6831 (Error : mauvais type d argument dans solidnombreinfaces) ==
6834 solid solidwithinfaces {
6835 /IO solid solidgetinouttable def
6845 %%%%% ### solidtests ###
6846 %% syntaxe : solid solidwithinfaces --> bool, true si le solide est vide
6851 (Error : mauvais type d argument dans solidwithinfaces) ==
6854 /table solid solidgetinouttable def
6863 %%%%% ### solidgetsommet ###
6864 %% syntaxe : solid i j solidgetsommetface --> sommet i de la face j
6865 /solidgetsommetface {
6871 (Error : mauvais type d argument dans solidgetsommetface) ==
6874 /table_faces solid solidgetfaces def
6875 /table_sommets solid solidgetsommets def
6876 /k table_faces j get i get def
6877 table_sommets k getp3d
6881 %% syntaxe : solid i solidgetsommetsface --> array, tableau des
6882 %% sommets de la face i du solide
6883 /solidgetsommetsface {
6888 (Error : mauvais type d argument dans solidgetsommetsface) ==
6891 /table_faces solid solidgetfaces def
6892 /table_sommets solid solidgetsommets def
6893 /table_indices table_faces i get def
6895 0 1 table_indices length 1 sub {
6897 table_sommets table_indices j get getp3d
6903 %% syntaxe : solid i solidgetsommet --> sommet i du solide
6909 (Error : mauvais type d argument dans solidgetsommet) ==
6912 /table_sommets solid solidgetsommets def
6913 table_sommets i getp3d
6917 %%%%% ### solidcentreface ###
6918 %% syntaxe : solid i solidcentreface --> M
6920 solidgetsommetsface isobarycentre3d
6923 %%%%% ### solidnombre ###
6924 /solidnombresommets {
6925 solidgetsommets length 3 idiv
6928 /solidfacenombresommets {
6933 solidgetfaces length
6936 %%%%% ### solidshowsommets ###
6944 /n sol solidnombresommets def
6945 /m sol solidnombrefaces def
6946 currentdict /option known not {
6947 /option [0 1 n 1 sub {} for] def
6949 0 1 option length 1 sub {
6951 option k get /i exch def %% indice du sommet examine
6952 sol i solidgetsommet point3d
6957 %%%%% ### solidnumsommets ###
6960 Font findfont 10 scalefont setfont
6966 /n sol solidnombresommets def
6967 /m sol solidnombrefaces def
6968 currentdict /option known not {
6969 /option [0 1 n 1 sub {} for] def
6974 0 1 option length 1 sub {
6976 option k get /i exch def %% indice du sommet examine
6978 /j exch def %% indice de la face examinee
6979 i sol j solidgetface in {
6980 %% le sommet i est dans la face j
6985 %% le sommet i est dans la face j
6986 sol j solidcentreface /G defpoint3d
6987 sol i solidgetsommet /S defpoint3d
6989 G S vecteur3d normalize3d
6990 15 dup ptojpoint pop
6998 %%%%% ### gestionsolidmode ###
6999 %% table = [ [vars] [mode0] [mode1] [mode2] [mode3] [mode4] ]
7007 /tableaffectation exch def
7010 /mode defaultsolidmode def
7013 /vars table 0 get def
7014 /nbvars vars length def
7016 /tableaffectation table mode 1 add 5 min get def
7021 tableaffectation i get
7028 %%%%% ### solidfuz ###
7029 %% syntaxe : solid1 solid2 solidfuz -> solid
7034 /S1 solid1 solidgetsommets def
7035 /S2 solid2 solidgetsommets def
7036 /n S1 length 3 idiv def
7041 %% les faces internes et leurs couleurs
7042 /FI1 solid1 solidgetinfaces def
7043 /FIC1 solid1 solidgetincolors def
7044 solid2 solidnombreinfaces 0 eq {
7048 /FI2 solid2 solidgetinfaces {{n add} apply} apply def
7049 /FIC2 solid2 solidgetincolors def
7051 /FI [FI1 aload pop FI2 aload pop] def
7052 /FIC [FIC1 aload pop FIC2 aload pop] def
7054 %% les faces externes et leurs couleurs
7055 /FO1 solid1 solidgetoutfaces def
7056 /FOC1 solid1 solidgetoutcolors def
7057 /FO2 solid2 solidgetoutfaces {{n add} apply} apply def
7058 /FOC2 solid2 solidgetoutcolors def
7059 /FO [FO1 aload pop FO2 aload pop] def
7060 /FOC [FOC1 aload pop FOC2 aload pop] def
7062 /F [FO aload pop FI aload pop] def
7063 /FC [FOC aload pop FIC aload pop] def
7067 dup 1 add dup FI length add 1 sub
7074 dup FC solidputfcolors
7075 dup IO solidputinouttable
7079 %%%%% ### solidnormaleface ###
7080 %% syntaxe : solid i solidnormaleface --> u, vecteur normale a la
7081 %% face d indice i du solide
7087 (Error : mauvais type d argument dans solidgetsommetface) ==
7090 %% solid 0 i solidgetsommetface /G defpoint3d
7092 %% solid 1 i solidgetsommetface
7095 %% solid 2 i solidgetsommetface
7098 /n solid i solidfacenombresommets def
7099 solid i solidcentreface /G defpoint3d
7100 %% debug %% G 3dto2d point
7102 solid 0 i solidgetsommetface
7104 % gsave bleu A point3d grestore
7106 vecteur3d normalize3d
7108 solid 1 i solidgetsommetface
7110 % gsave orange A point3d grestore
7112 vecteur3d normalize3d
7114 /resultat defpoint3d
7115 resultat normalize3d
7119 %%%%% ### solidtransform ###
7120 %% syntaxe : solid1 {f} solidtransform --> solid2, solid2 est le
7121 %% transforme de solid1 par la transformation f : R^3 -> R^3
7127 (Error : mauvais type d argument dans solidtransform) ==
7131 solid solidgetsommets {@f} papply3d
7133 solid les_sommets solidputsommets
7138 %%%%% ### solidputcolor ###
7139 %% syntaxe : solid i string solidputfcolor
7145 /FC solid solidgetfcolors def
7152 %% syntaxe : solid solidgetincolors --> array
7157 (Error : mauvais type d argument dans solidgetincolors) ==
7160 solid solidwithinfaces {
7161 /fcol solid solidgetfcolors def
7162 /IO solid solidgetinouttable def
7165 /n n2 n1 sub 1 add def
7166 fcol n1 n getinterval
7173 %% syntaxe : solid solidgetoutcolors --> array
7174 /solidgetoutcolors {
7178 (Error : mauvais type d argument dans solidgetoutcolors) ==
7181 /fcol solid solidgetfcolors def
7182 /IO solid solidgetinouttable def
7185 /n n2 n1 sub 1 add def
7186 fcol n1 n getinterval
7190 %% syntaxe : solid array solidputincolors --> -
7193 /newcolorstable exch def
7196 (Error : mauvais type d argument dans solidputincolors) ==
7199 /n newcolorstable length def
7200 n solid solidnombreinfaces ne {
7201 (Error : mauvaise longueur de tableau dans solidputincolors) ==
7205 /FC solid solidgetfcolors def
7206 /IO solid solidgetinouttable def
7208 FC n1 newcolorstable putinterval
7213 %% syntaxe : solid array solidputoutcolors --> -
7214 /solidputoutcolors {
7216 /newcolorstable exch def
7219 (Error : mauvais type d argument dans solidputoutcolors) ==
7222 /n newcolorstable length def
7223 n solid solidnombreoutfaces ne {
7224 (Error : mauvaise longueur de tableau dans solidputoutcolors) ==
7228 /FC solid solidgetfcolors def
7229 /IO solid solidgetinouttable def
7231 FC n1 newcolorstable putinterval
7236 %% syntaxe : solid str outputcolors
7242 (Error : mauvais type d argument dans inoutputcolors) ==
7245 /n solid solidnombreoutfaces def
7246 solid [ n {color} repeat ] solidputoutcolors
7250 %% syntaxe : solid str inputcolors
7256 (Error : mauvais type d argument dans inoutputcolors) ==
7259 /n solid solidnombreinfaces def
7260 solid [ n {color} repeat ] solidputincolors
7264 %% syntaxe : solid str1 str2 inoutputcolors
7270 solid colin inputcolors
7271 solid colout outputcolors
7275 %% syntaxe : solid array solidputoutcolors --> -
7276 /solidputoutcolors {
7278 /newcolorstable exch def
7281 (Error : mauvais type d argument dans solidputoutcolors) ==
7284 /n newcolorstable length def
7285 n solid solidnombreoutfaces ne {
7286 (Error : mauvaise longueur de tableau dans solidputoutcolors) ==
7290 /FC solid solidgetfcolors def
7291 /IO solid solidgetinouttable def
7293 FC length n n1 add lt {
7294 solid newcolorstable solidputfcolors
7296 FC n1 newcolorstable putinterval
7313 %%%%% ### solidputhuecolors ###
7314 %% syntaxe : solid table solidputhuecolors --> -
7315 /solidputhuecolors {
7318 solidgetinouttable /IO exch def
7325 /solidputinhuecolors {
7329 solid solidgetinouttable /IO exch def
7330 solid solidwithinfaces {
7339 /solidputinouthuecolors {
7342 solidgetinouttable /IO exch def
7344 IO 3 get IO 1 get max
7349 %% syntaxe : solid table n1 n2 s@lidputhuec@l@rs --> -
7350 %% affecte les couleurs des faces d indice n1 a n2 du solid solid, par
7351 %% un degrade defini par la table.
7352 /s@lidputhuec@l@rs {
7366 [a0 cvx exec] length 0 eq {
7367 a0 cvx exec currentrgbcolor
7375 [a1 cvx exec] length 0 eq {
7376 a1 cvx exec currentrgbcolor
7382 /table [lacouleurdepart lacouleurarrivee] def
7384 /A {a0 i a1 a0 sub mul n 1 sub div add} def
7388 /espacedecouleurs (sethsbcolor) def
7395 /A {a0 i a1 a0 sub mul n 1 sub div add} def
7399 /espacedecouleurs (sethsbcolor) def
7409 /A {a0 i a1 a0 sub mul n 1 sub div add} def
7410 /B {b0 i b1 b0 sub mul n 1 sub div add} def
7411 /C {c0 i c1 c0 sub mul n 1 sub div add} def
7413 /espacedecouleurs (setrgbcolor) def
7423 /A {a0 i a1 a0 sub mul n 1 sub div add} def
7424 /B {b0 i b1 b0 sub mul n 1 sub div add} def
7425 /C {c0 i c1 c0 sub mul n 1 sub div add} def
7427 /espacedecouleurs (sethsbcolor) def
7439 /A {a0 i a1 a0 sub mul n 1 sub div add} def
7440 /B {b0 i b1 b0 sub mul n 1 sub div add} def
7441 /C {c0 i c1 c0 sub mul n 1 sub div add} def
7442 /D {d0 i d1 d0 sub mul n 1 sub div add} def
7443 /espacedecouleurs (setcmykcolor) def
7449 [A B C D] espacedecouleurs astr2str
7456 %%%%% ### solidrmface ###
7457 %% syntaxe : solid i solidrmface -> -
7463 (Error : mauvais type d argument dans solidrmface) ==
7466 %% on enleve la face
7467 /F solid solidgetfaces def
7468 F length 1 sub i lt {
7469 (Error : indice trop grand dans solidrmface) ==
7473 0 1 F length 1 sub {
7481 solid NF solidputfaces
7482 %% on enleve la couleur correspondante
7483 /FC solid solidgetfcolors def
7485 0 1 FC length 1 sub {
7493 solid NFC solidputfcolors
7494 %% on ajuste la table inout
7495 /IO solid solidgetinouttable def
7496 solid i solidisoutface {
7497 IO 1 IO 1 get 1 sub put
7498 solid solidwithinfaces {
7499 IO 2 IO 2 get 1 sub put
7500 IO 3 IO 3 get 1 sub put
7503 solid i solidisinface {
7504 IO 1 IO 1 get 1 sub put
7505 IO 2 IO 2 get 1 sub put
7506 IO 3 IO 3 get 1 sub put
7508 solid IO solidputinouttable
7512 %% syntaxe : solid table solidrmfaces --> -
7515 /table exch bubblesort reverse def
7517 table {solid exch solidrmface} apply
7521 %%%%% ### videsolid ###
7522 %% syntaxe : solid videsolid -> -
7527 (Error : mauvais type d argument dans videsolid) ==
7530 solid solidwithinfaces not {
7531 /IO solid solidgetinouttable def
7532 /FE solid solidgetfaces def
7535 IO 3 2 n mul 1 sub put
7536 solid IO solidputinouttable
7537 %% on inverse chaque face
7538 /FI FE {reverse} apply def
7539 solid FE FI append solidputfaces
7540 %% et on rajoute autant de couleurs vides que de faces
7541 /FEC solid solidgetfcolors def
7542 % /FIC [FI length {()} repeat] def
7543 % solid FEC FIC append solidputfcolors
7544 solid FEC duparray append solidputfcolors
7549 %%%%% ### solidnumfaces ###
7550 %% syntaxe : solid array solidnumfaces
7551 %% syntaxe : solid array bool solidnumfaces
7552 %% array, le tableau des indices des faces a numeroter, est optionnel
7553 %% si bool=true, on ne numerote que les faces visibles
7567 /n sol solidnombrefaces def
7568 currentdict /option known not {
7569 /option [0 1 n 1 sub {} for] def
7572 0 1 option length 1 sub {
7575 j ( ) cvs sol j bool cctextp3d
7580 %%%%% ### creusesolid ###
7581 %% syntaxe : solid creusesolid -> -
7586 (Error : mauvais type d argument dans creusesolid) ==
7589 %% on enleve le fond et le chapeau
7592 %% on inverse chaque face
7597 %%%%% ### fin insertion ###
7599 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7600 %%%% dessin des solides %%%%
7601 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7603 %%%%% ### solidisinface ###
7604 %% syntaxe : solid i solidisinface --> bool
7605 %% true si i est l indice d une face interne, false sinon
7609 solidgetinouttable /IO exch def
7617 %%%%% ### solidisoutface ###
7618 %% syntaxe : solid i solidisoutface --> bool
7619 %% true si i est l indice d une face externe, false sinon
7623 solidgetinouttable /IO exch def
7631 %%%%% ### planvisible ###
7632 %% syntaxe : A k planvisible? --> true si le plan est visible
7635 /normale_plan defpoint3d
7642 ligne_de_vue normale_plan scalprod3d 0 gt
7646 %%%%% ### solidlight ###
7647 /setlightintensity {
7648 /lightintensity exch def
7652 /lightsrc defpoint3d
7659 [ currentrgbcolor ] /lightcolor exch
7665 %%%%% ### drawsolid ###
7667 /s@lidlight true def
7670 /s@lidlight false def
7674 %% syntaxe : solid i solidfacevisible? --> true si la face est visible
7675 /solidfacevisible? {
7680 (Error : mauvais type d argument dans solidgetsommetface) ==
7683 solid i solidgetface length 2 le {
7687 solid i solidcentreface
7693 solid i solidnormaleface
7695 ligne_de_vue normale_face scalprod3d 0 gt
7700 %% syntaxe : solid i affectecouleursolid_facei --> si la couleur de
7701 %% la face i est definie, affecte fillstyle a cette couleur
7702 /affectecouleursolid_facei {
7706 solid solidgetfcolors /FC exch def
7707 FC length 1 sub i ge {
7708 FC i get length 1 ge {
7709 /fillstyle FC i get ( Fill) append cvx
7724 %% syntaxe : solid i dessinefacecachee
7725 /dessinefacecachee {
7730 (Error : mauvais type d argument dans dessinefacecachee) ==
7734 /F solid solidgetfaces def
7735 /S solid solidgetsommets def
7737 %% face cachee => on prend chacune des aretes de la face et on
7740 /n F i get length def %% nb de sommets de la face
7743 /k1 F i k get_ij def %% indice sommet1
7744 /k2 F i k 1 add n mod get_ij def %% indice sommet2
7746 currentlinewidth .5 mul setlinewidth
7749 S k2 getp3d sortp3d] ligne3d
7753 %% trace de la ligne de niveau
7754 solidintersectiontype 0 ge {
7755 /face_a_dessiner [ %% face visible : F [i]
7758 solid j i solidgetsommetface
7761 0 1 solidintersectionplan length 1 sub {
7763 /lignedeniveau [] def
7766 k solidintersectionlinewidth length lt {
7767 solidintersectionlinewidth k get setlinewidth
7769 solidintersectionlinewidth 0 get setlinewidth
7771 k solidintersectioncolor length lt {
7772 solidintersectioncolor k get cvx exec
7774 solidintersectioncolor 0 get cvx exec
7778 face_a_dessiner j getp3d
7779 face_a_dessiner j 1 add n mod getp3d
7780 solidintersectionplan k get
7789 /lignedeniveau table store
7793 lignedeniveau aload pop
7801 %% dessin de la ligne
7802 lignedeniveau length 4 ge {
7803 [lignedeniveau aload pop sortp3d] ligne3d
7813 %% syntaxe : solid i dessinefacevisible
7814 /dessinefacevisible {
7819 (Error : mauvais type d argument dans dessinefacevisible) ==
7822 /F solid solidgetfaces def
7823 /S solid solidgetsommets def
7825 /n F i get length def %% nb de sommets de la face
7831 solid i solidnormaleface normalize3d
7832 solid i solidcentreface lightsrc vecteur3d normalize3d
7838 /lacouleur lightcolor def
7842 solid solidgetfcolors i get cvx exec currentrgbcolor
7847 lacouleur {coeff mul} apply setcolor Fill
7850 lacouleur {coeff mul} apply setcolor
7856 solid i affectecouleursolid_facei
7859 solid i affectecouleursolid_facei
7864 /face_a_dessiner [ %% face visible : F [i]
7867 solid j i solidgetsommetface
7870 face_a_dessiner polygone3d
7872 %% trace de la ligne de niveau
7873 solidintersectiontype 0 ge {
7874 0 1 solidintersectionplan length 1 sub {
7876 /lignedeniveau [] def
7878 k solidintersectionlinewidth length lt {
7879 solidintersectionlinewidth k get setlinewidth
7881 solidintersectionlinewidth 0 get setlinewidth
7883 k solidintersectioncolor length lt {
7884 solidintersectioncolor k get cvx exec
7886 solidintersectioncolor 0 get cvx exec
7890 face_a_dessiner j getp3d
7891 face_a_dessiner j 1 add n mod getp3d
7892 solidintersectionplan k get
7901 lignedeniveau aload pop
7911 %% dessin de la ligne
7912 lignedeniveau length 4 ge {
7913 solid i solidisinface {
7916 lignedeniveau ligne3d
7927 /startest {true} def
7932 /peintrealgorithme false def
7936 /aretescachees false def
7937 /peintrealgorithme true def
7942 %% syntaxe : solid array drawsolid
7943 %% array est en option, il indique les faces triees
7951 (Error : mauvais type d argument dans drawsolid) ==
7954 solid nullsolid not {
7957 solid solidgetsommets
7959 /n S length 3 idiv def
7961 currentdict /ordre known not {
7963 %% tri des indices des faces par distance decroissante
7965 0 1 F length 1 sub {
7967 solid i solidcentreface
7971 ] doublequicksort pop reverse
7974 0 1 F length 1 sub {
7981 0 1 F length 1 sub {
7985 solid i solidfacevisible? {
7986 solid i dessinefacevisible
7991 0 1 F length 1 sub {
7995 solid i solidfacevisible? not {
7996 solid i dessinefacecachee
8002 %% %% si on veut repasser les traits des faces visibles
8003 %% 0 1 F length 1 sub {
8005 %% /i ordre k get def
8008 %% /startest false def
8009 %% solid i solidfacevisible? {
8010 %% solid i dessinefacevisible
8019 %%%%% ### segment_inter_planz ###
8020 %% syntaxe : A B k segment_inter_planz --> array true ou false
8021 /segment_inter_planz {
8026 A /zA exch def pop pop
8027 B /zB exch def pop pop
8028 zA k sub zB k sub mul dup 0 gt {
8029 %% pas d intersection
8034 %% intersection en A ou en B
8040 %% intersection entre A et B
8043 k zA sub zB zA sub div mulv3d
8051 %%%%% ### fin insertion ###
8053 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8054 %%%% plans affines %%%%
8055 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8057 %%%%% ### planaffine ###
8058 %% plan : origine, base, range, ngrid
8059 %% [0 0 0 [1 0 0 0 1 0] [-3 3 -2 2] [1. 1.] ]
8061 /explan [0 0 0 [1 0 0 0 1 0 0 0 1] [-3 3 -2 2] [1. 1.] ] def
8063 %% syntaxe : any isplan --> bool
8068 candidat length 6 eq {
8069 candidat 3 get isarray {
8070 candidat 4 get isarray {
8071 candidat 5 get isarray
8088 [0 0 0 [1 0 0 0 1 0] [-3 3 -2 2] [1 1]]
8094 /result newplanaffine def
8095 result leplan plangetorigine planputorigine
8096 result leplan plangetbase planputbase
8097 result leplan plangetrange planputrange
8098 result leplan plangetngrid planputngrid
8103 %% syntaxe : plantype getorigine --> x y z
8108 (Erreur : mauvais type d argument dans plangetorigine) ==
8117 %% syntaxe : plantype getbase --> [u v w]
8118 %% ou u, v et w vecteurs de R^3
8123 (Erreur : mauvais type d argument dans plangetbase) ==
8130 %% syntaxe : plantype getrange --> array
8131 %% ou array = [xmin xmax ymin ymax]
8136 (Erreur : mauvais type d argument dans plangetrange) ==
8143 %% syntaxe : plantype getngrid --> array
8144 %% ou array = [n1 n2]
8149 (Erreur : mauvais type d argument dans plangetngrid) ==
8156 %% ===================
8158 %% syntaxe : plantype x y z putorigine --> -
8166 (Erreur : mauvais type d argument dans planputorigine) ==
8175 %% syntaxe : plantype [u v w] putbase --> -
8176 %% ou u, v et w vecteurs de R^3
8182 (Erreur : mauvais type d argument dans planputbase) ==
8189 %% syntaxe : plantype array putrange --> -
8190 %% ou array = [xmin xmax ymin ymax]
8196 (Erreur : mauvais type d argument dans planputrange) ==
8203 %% syntaxe : plantype array putngrid --> -
8204 %% ou array = [n1 n2]
8210 (Erreur : mauvais type d argument dans planputngrid) ==
8217 %% -3 3 -2 2 1. 1. newgrille
8222 %% plan : origine, base, range, ngrid
8224 %% syntaxe : plantype drawplanaffine --> -
8234 plan plangetrange plan plangetngrid aload pop quadrillagexOy_
8235 plan plangetorigine [imI imK] false planprojpath
8241 %% %% syntaxe : [a b c d] (x0 y0 z0) alpha defeqplanaffine --> plantype
8242 %% %% plan defini par l equation ax+by+cz+d=0,
8243 %% %% rotation de alpha autour de la normale (alpha est optionnel)
8244 %% %% origine (x0, y0, z0). l origine est optionnelle
8245 %% /defeqplanaffine {
8257 %% cvx /origine exch def
8260 %% table length 4 ne {
8261 %% (Erreur : mauvais type d argument dans defeqplanaffine) ==
8264 %% table 0 get /a exch def
8265 %% table 1 get /b exch def
8266 %% table 2 get /c exch def
8267 %% table 3 get /d exch def
8268 %% /resultat newplanaffine def
8269 %% [a b c alpha] normalvect_to_orthobase
8273 %% resultat [imI imJ imK] planputbase
8274 %% currentdict /origine known {
8275 %% origine /z exch def /y exch def /x exch def
8276 %% a x mul b y mul add c z mul add d add 0 ne {
8277 %% (Erreur : mauvaise origine dans defeqplanaffine) ==
8280 %% resultat origine planputorigine
8283 %% resultat 0 0 d neg c div planputorigine
8286 %% resultat d neg a div 0 0 planputorigine
8288 %% resultat 0 d neg b div 0 planputorigine
8296 %% /explan [0 0 0 [1 0 0 0 1 0 0 0 1] [-3 3 -2 2] [1 1] ] def
8297 %% explan drawplanaffine
8299 %% /explan [0 0 2 [1 0 0 0 1 0 0 0 1] [-3 3 -2 2] [1 .5] ] def
8300 %% explan drawplanaffine
8303 %% [0 0 1 -2] defeqplanaffine
8306 %% [0 0 1 0] defeqplanaffine
8309 %% [1 1 1 0] (1 -1 0) defeqplanaffine
8322 {M0 translatepoint3d} solidtransform
8326 {M0 translatepoint3d} solidtransform
8330 {M0 translatepoint3d} solidtransform
8336 %% syntaxe : solid i solidface2eqplan --> [a b c d]
8337 %% equation cartesienne de la face d'indice i du solide solid
8342 solid i solidnormaleface
8346 solid 0 i solidgetsommetface
8350 [a b c a x mul b y mul add c z mul add neg]
8355 %% syntaxe : plantype newplan --> solid
8359 lepl@n plangetbase /@base exch def
8360 @base 0 getp3d /@U defpoint3d
8361 @base 1 getp3d /@V defpoint3d
8362 lepl@n plangetorigine /@M defpoint3d
8363 lepl@n plangetrange /@range exch def
8364 lepl@n plangetngrid /@ngrid exch def
8375 @range aload pop @ngrid {@F} newsurfaceparametree
8379 %% syntaxe : M eqplan --> real
8380 %% image de M par la fonction definie par l equation eqplan
8387 /@a eqplan 0 get def
8388 /@b eqplan 1 get def
8389 /@c eqplan 2 get def
8390 /@d eqplan 3 get def
8391 @a @x mul @b @y mul add @c @z mul add @d add
8398 leplan plangetbase aload pop vectprod3d
8402 leplan plangetorigine
8406 [a b c a x0 mul b y0 mul add c z0 mul add neg]
8410 %% syntaxe : [a b c d] (x0 y0 z0) alpha defeqplanaffine --> plantype
8411 %% plan defini par l equation ax+by+cz+d=0,
8412 %% rotation de alpha autour de la normale (alpha est optionnel)
8413 %% origine (x0, y0, z0). l origine est optionnelle
8426 cvx /origine exch def
8430 (Erreur : mauvais type d argument dans eq2plan) ==
8433 table 0 get /a exch def
8434 table 1 get /b exch def
8435 table 2 get /c exch def
8436 table 3 get /d exch def
8437 /resultat newplanaffine def
8438 [a b c alpha] normalvect_to_orthobase
8442 resultat [imI imJ] planputbase
8443 currentdict /origine known {
8444 origine /z exch def /y exch def /x exch def
8445 a x mul b y mul add c z mul add d add 0 ne {
8446 (Erreur : mauvaise origine dans eq2plan) ==
8449 resultat origine planputorigine
8452 resultat 0 0 d neg c div planputorigine
8455 resultat d neg a div 0 0 planputorigine
8458 resultat 0 d neg b div 0 planputorigine
8460 (Error dans eq2plan : (a,b,c) = (0,0,0)) ==
8485 [a b c a xA mul b yA mul add c zA mul add neg]
8490 %% %[0 0 -2 [1 0 0 0 1 0 0 0 1] [-3 3 -2 2] [1. 1.]]
8491 %% [0 0 1 1] 30 eq2plan
8494 %% [0 0 1 -2] eq2plan newplan
8495 %% dup (blanc) outputcolors
8497 %% dup (blanc) outputcolors
8500 %% monplan plangetorigine
8501 %% monplan plangetbase aload pop dessinebase
8503 %% syntaxe : x0 y0 z0 [normalvect] norm2plan
8506 normalvect_to_orthobase
8517 [a b c a x0 mul b y0 mul add c z0 mul add neg] eq2plan
8518 dup x0 y0 z0 planputorigine
8519 dup [imI imJ] planputbase
8523 %% syntaxe : plantype planxmarks
8532 leplan plangetrange aload pop
8538 xmin truncate cvi 0 smoveto
8539 xmax truncate cvi 0 slineto
8540 leplan mybool projpath
8542 xmin truncate cvi xmkstep xmax truncate cvi {
8549 dup chaine cvs exch 0 leplan mybool dctextp3d
8554 leplan mybool projpath
8557 pop (0) 0 0 leplan mybool dltextp3d
8563 %% syntaxe : plantype planymarks
8572 leplan plangetrange aload pop
8578 0 ymin truncate cvi smoveto
8579 0 ymax truncate cvi slineto
8580 leplan mybool projpath
8582 ymin truncate cvi ymkstep ymax truncate cvi {
8589 dup chaine cvs exch 0 exch leplan mybool cltextp3d
8594 leplan mybool projpath
8597 pop (0) 0 0 leplan mybool dltextp3d
8603 %% syntaxe : plantype planmarks
8611 dup mybool planxmarks mybool planymarks
8616 %% [-3 3 -2 2] quadrillagexOy_
8620 %% syntaxe : [xmin xmax ymin ymax] dx dy quadrillagexOy_
8635 table 0 get /xmin exch def
8636 table 1 get /xmax exch def
8637 table 2 get /ymin exch def
8638 table 3 get /ymax exch def
8652 %% syntaxe : plan [ngrid] planquadrillage
8668 /table leplan plangetrange def
8669 table 0 get cvi truncate /xmin exch def
8670 table 1 get cvi truncate /xmax exch def
8671 table 2 get cvi truncate /ymin exch def
8672 table 3 get cvi truncate /ymax exch def
8684 leplan mybool projpath
8689 %% syntaxe : plantype str1 str2 planshowbase -> -
8690 %% syntaxe : plantype str2 planshowbase -> -
8691 %% syntaxe : plantype planshowbase -> -
8704 /couleur1 (rouge) def
8707 /couleur1 (rouge) def
8708 /couleur2 (vert) def
8727 %% syntaxe : plantype str1 str2 str3 planshowbase3d -> -
8728 %% syntaxe : plantype str2 str3 planshowbase3d -> -
8729 %% syntaxe : plantype str3 planshowbase3d -> -
8730 %% syntaxe : plantype planshowbase3d -> -
8731 %% syntaxe : plantype str1 str2 str3 array planshowbase3d -> -
8732 %% syntaxe : plantype str2 str3 array planshowbase3d -> -
8733 %% syntaxe : plantype str3 array planshowbase3d -> -
8734 %% syntaxe : plantype array planshowbase3d -> -
8742 dup dup isarray exch isplan not and {
8754 /couleur1 (rouge) def
8757 /couleur2 (vert) def
8758 /couleur1 (rouge) def
8761 /couleur1 (rouge) def
8762 /couleur2 (vert) def
8763 /couleur3 (bleu) def
8766 plan couleur1 couleur2 mybool planshowbase
8767 plan plangetorigine /I defpoint3d
8769 dup 0 getp3d /u defpoint3d
8770 1 getp3d /v defpoint3d
8771 u v vectprod3d table newvecteur
8772 {I addv3d} solidtransform
8773 dup couleur3 solidputcolors
8779 %% syntaxe : plantype x y z plantranslate --> -
8785 (Erreur : mauvais type d argument dans plantranslate) ==
8788 plan plan plangetorigine M addv3d planputorigine
8792 % syntaxe : alpha_x alpha_y alpha_z rotateOpplan --> -
8798 (Erreur : mauvais type d argument dans rotateOplan) ==
8801 plan plan plangetorigine Rxyz rotateOpoint3d planputorigine
8803 plan plangetbase 0 getp3d /U defpoint3d
8804 plan plangetbase 1 getp3d /V defpoint3d
8806 U Rxyz rotateOpoint3d
8807 V Rxyz rotateOpoint3d
8812 %% syntaxe : plantype phi rotateplan --> -
8817 leplan plangetbase 0 getp3d /U defpoint3d
8818 leplan plangetbase 1 getp3d /V defpoint3d
8820 V phi sin mulv3d addv3d /U0 defpoint3d
8821 U phi sin neg mulv3d
8822 V phi cos mulv3d addv3d /V0 defpoint3d
8823 leplan [U0 V0] planputbase
8827 %% syntaxe : solid i solidface2plan --> plantype
8828 %% syntaxe : solid i I solidface2plan --> plantype
8831 2 copy pop issolid {
8834 solid i solidcentreface /I defpoint3d
8840 /result newplanaffine def
8841 solid i solidcentreface /G defpoint3d
8842 solid i solidnormaleface /K defpoint3d
8843 solid 0 i solidgetsommetface
8844 solid 1 i solidgetsommetface
8845 milieu3d /A defpoint3d
8846 G A vecteur3d normalize3d /U defpoint3d
8847 K U vectprod3d /V defpoint3d
8848 result [U V] planputbase
8849 result I planputorigine
8854 %%%%% ### fin insertion ###
8855 %% syntaxe : x y plantype pointplan --> X Y Z
8861 leplan plangetbase 0 getp3d /U defpoint3d
8862 leplan plangetbase 1 getp3d /V defpoint3d
8863 U x mulv3d V y mulv3d addv3d
8867 %%%%% ### fin insertion ###
8870 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8871 %%%% operations sur des solides particuliers %%%%
8872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8877 mypie 0 solidgetface length /n exch def
8878 mypie n 2 idiv solidgetsommet /A defpoint3d
8879 mypie n 2 idiv 1 add solidgetsommet /B defpoint3d
8880 A B milieu3d GetCamPos distance3d
8891 0 1 table length 1 sub {
8896 doublequicksort pop reverse
8899 0 1 result length 1 sub {
8901 table result i get get
8910 sortpieset dup {drawsolid**} apply {0 dessinefacevisible} apply
8914 %%%%% ### solidchanfreine ###
8915 %% syntaxe : solid coeff solidchanfreine --> solid
8920 /result newsolid def
8922 (Erreur : mauvais type d argument dans solidchanfreine) ==
8925 /n solid solidnombresommets def
8926 /nf solid solidnombrefaces def
8928 %% ajout des faces reduites
8931 /Fsommets solid i solidgetsommetsface def
8932 /Findex solid i solidgetface def
8933 /ns Fsommets length 3 idiv def
8934 /couleurfaceorigine solid i solidgetfcolor def
8935 Fsommets isobarycentre3d /G defpoint3d
8936 %% on ajoute les nouveaux sommets
8940 /Sindex [ Sindex aload pop
8941 Fsommets j getp3d /M defpoint3d
8942 result M G coeff hompoint3d solidaddsommet
8945 %% Sindex contient les indices des nouveaux sommets
8946 result Sindex couleurfaceorigine solidaddface
8949 %% ajout des faces rectangulaires entre faces d'origines adjacentes
8950 %% pour chaque face de depart
8953 /F solid i solidgetface def
8954 /couleurfaceorigine solid i solidgetfcolor def
8955 /Fres result i solidgetface def
8956 %% pour chaque arete de la face
8957 0 1 F length 1 sub {
8960 /indice1 F j get def
8961 /indice2 F j 1 add F length mod get def
8963 /a2 j 1 add F length mod def
8964 %% on regarde toutes les autres faces
8965 i 1 add 1 nf 1 sub {
8967 /Ftest solid k solidgetface def
8968 indice1 Ftest in {pop true} {false} ifelse
8969 indice2 Ftest in {pop true} {false} ifelse
8972 indice1 Ftest in pop /k1 exch def
8973 indice2 Ftest in pop /k2 exch def
8979 /Fadj solid indiceFadj solidgetface def
8982 result indiceFadj solidgetface k1 get
8983 result indiceFadj solidgetface k2 get
8985 ] couleurfaceorigine solidaddface
8993 /F solid i solidgetface def
8994 /couleurfaceorigine solid i solidgetfcolor def
8995 %% et pour chaque sommet de cette face
8996 0 1 F length 1 sub {
8999 solid k solidfacesadjsommet /adj exch def
9000 %% adj est le tableau des indices des faces adjacentes
9001 %% au sommet d'indice k
9002 %% rque : toutes les faces d'indice strict inferieur a i
9003 %% sont deja traitees
9004 %% Pour chaque face adjacente, on repere l'indice du sommet concerne dans
9008 0 1 adj length 1 sub {
9010 k solid adj m get solidgetface in {
9012 /indadj [indadj aload pop ok] store
9017 0 1 adj length 1 sub {
9019 result adj m get solidgetface indadj m get get
9023 %% la table des sommets
9024 [0 1 aajouter length 1 sub {
9026 result aajouter m get solidgetsommet
9028 solid k solidgetsommet %% le point indiquant la direction de la normale
9030 /indicestries exch def
9033 0 1 indicestries length 1 sub {
9035 aajouter indicestries m get get
9037 ] couleurfaceorigine solidaddface
9046 %%%%% ### solidplansection ###
9047 %% syntaxe : M eqplan --> real
9048 %% image de M par la fonction definie par l equation eqplan
9055 /@a @qplan 0 get def
9056 /@b @qplan 1 get def
9057 /@c @qplan 2 get def
9058 /@d @qplan 3 get def
9059 @a @x mul @b @y mul add @c @z mul add @d add
9063 %% syntaxe : A B eqplan segment_inter_plan --> array true ou false
9064 %% array contient 1 point M si [AB] inter plan = {M}
9065 %% array contient les 2 points A et B si [AB] inter plan = [AB]
9066 /segment_inter_plan {
9068 dup isplan {plan2eq} if
9085 /imA a xA mul b yA mul add c zA mul add d add def
9086 /imB a xB mul b yB mul add c zB mul add d add def
9087 imA imB mul dup 0 gt {
9088 %% pas d intersection
9093 %% intersection en A ou en B
9099 %% intersection entre A et B
9106 (Error dans segment_inter_plan) ==
9121 %% syntaxe : solid i solidface2eqplan --> [a b c d]
9122 %% equation cartesienne de la face d'indice i du solide solid
9127 solid i solidnormaleface
9131 solid 0 i solidgetsommetface
9135 [a b c a x mul b y mul add c z mul add neg]
9139 %% syntaxe : array1 arrayrmdouble --> array2
9140 %% remplace 2 elts identiques consecutifs par 1 elt
9144 /result [table 0 get] def
9146 1 1 table length 1 sub {
9151 /result [result aload pop table i get] store
9159 %% syntaxe : solid eqplan/plantype solidplansection --> solid2
9173 dupsolid /result exch def
9176 /indnouveauxsommets [] def
9177 /nouvellesaretes [] def
9179 %% pour chaque face d'indice i
9180 0 1 solid solidnombrefaces 1 sub {
9182 /lacouleur solid i solidgetfcolor def
9183 /F solid i solidgetface def %% table des indices des sommets
9184 /n F length def %% nb d'aretes
9191 %% pour chaque arete [AB]
9194 %% arete testee : [j, j+1 mod n] (indices relatifs a la face i)
9195 solid j i solidgetsommetface /A defpoint3d
9196 solid j 1 add n mod i solidgetsommetface /B defpoint3d
9197 %% y a-t-il intersection
9198 A B eqplan segment_inter_plan {
9199 %% il y a intersection
9201 %% l'intersection, c'est [AB]
9208 dup 0 getp3d /A defpoint3d
9209 1 getp3d /B defpoint3d
9210 result A solidaddsommet /a1 exch def
9211 result B solidaddsommet /a2 exch def
9212 /indnouveauxsommets [
9213 indnouveauxsommets aload pop a1 a2
9217 nouvellesaretes aload pop
9219 exit %% c est deja scinde
9221 %% il y a intersection <> [AB]
9223 %% 1ere intersection de la face
9224 /k1 j def %% sommet precedent intersection 1
9225 result exch aload pop solidaddsommet
9226 /k1a exch def %% sommet intersection 1
9229 %% 2eme intersection de la face
9230 /k2 j def %% sommet precedent intersection 2
9231 result exch aload pop solidaddsommet
9232 /k2a exch def %% sommet intersection 2
9235 %% 3eme intersection de la face
9236 /k3 j def %% sommet precedent intersection 3
9237 result exch aload pop solidaddsommet
9238 /k3a exch def %% sommet intersection 3
9240 %% 4eme intersection de la face
9241 /k4 j def %% sommet precedent intersection 4
9242 result exch aload pop solidaddsommet
9243 /k4a exch def %% sommet intersection 4
9250 %% y a-t-il eu une coupe ?
9251 %% si oui, il faut scinder la face d'indice i en cours
9255 %% k1 == k2 == k3 == k4 ==
9257 %% k1a == k2a == k3a == k4a ==
9258 k1a k2a eq k3 0 lt and {
9259 %% 1 pt d'intersection
9261 %% il y a coupe, on cherche a eliminer les
9262 %% doublons dans {k1a, k2a, k3a, k4a}
9263 k1a k2a eq k3 0 ge and {
9264 %% 2 pts d'intersection
9268 k1a k3a eq k4 0 ge and {
9269 %% 2 pts d'intersection
9275 nouvellesaretes aload pop
9278 k1a F k1 1 add n mod get ne {
9281 k1 1 add n mod 1 k2 {F exch get} for
9286 result exch lacouleur solidaddface
9287 /indnouveauxsommets [indnouveauxsommets aload pop k1a k2a] store
9289 k2a F k2 1 add n mod get ne {
9293 k2 1 add n mod 1 n 1 sub {F exch get} for
9295 0 1 k1 {F exch get} for
9300 result exch lacouleur solidaddface
9301 /aenlever [aenlever aload pop i] store
9305 result aenlever solidrmfaces
9307 nouvellesaretes separe_composantes
9308 /composantes exch def
9310 %% pour chacune des composantes
9311 0 1 composantes length 1 sub {
9312 %% on oriente et on ajoute la face
9314 %indnouveauxsommets bubblesort arrayrmdouble
9315 /indnouveauxsommets composantes icomp get def
9316 %% maintenant, on ajoute la face de plan de coupe
9318 0 1 indnouveauxsommets length 1 sub {
9320 result indnouveauxsommets i get solidgetsommet
9324 0 0 0 eqplan pointeqplan 0 eq {
9330 %% restera a traiter le cas limite ou la nouvelle face existe deja
9331 %% tester si max(indicestries) < nb sommets avant section
9332 nouveauxsommets ptref ordonnepoints3d
9333 /indicestries exch def
9335 0 1 indicestries length 1 sub {
9337 indnouveauxsommets indicestries m get get
9340 /F result solidgetfaces def
9341 /FC result solidgetfcolors def
9342 /IO result solidgetinouttable def
9345 result IO solidputinouttable
9346 result [nvelleface F aload pop] solidputfaces
9347 result [lacouleur FC aload pop] solidputfcolors
9356 %% syntaxe : elt array compteoccurences
9357 %% ou array est un tableau du type [ [a1 a2] [b1 b2] [c1 c2] ... ]
9363 0 1 table length 1 sub {
9365 elt table i get in {
9374 /separe_composantes {
9376 /result [] def %% les composantes deja faites
9377 /table exch def %% ce qui reste a faire
9379 % (recu) == table {==} apply
9381 /ext1 table 0 get 1 get def
9382 /ext0 table 0 get 0 get def
9385 { %% maintenant on suit les extremites et on epluche une composante
9388 0 1 table length 1 sub {
9391 ext0 table i get In or {
9392 /aenlever [aenlever aload pop i] store
9394 %% l'arete i contient l'extremite ext0 ou ext1
9395 ext0 table i get in {
9397 neg 1 add table i get exch get
9399 ext0 composante In not {
9400 /composante [composante aload pop ext0] store
9402 %% on verifie que ext0 est legitime
9403 ext0 table compteoccurences 2 gt {
9407 ext1 table i get in {
9409 neg 1 add table i get exch get
9411 ext1 composante In not {
9412 /composante [composante aload pop ext1] store
9414 %% on verifie que ext1 est legitime
9415 ext1 table compteoccurences 2 gt {
9421 %% il faut reconstruire table
9423 0 1 table length 1 sub {
9432 change not {exit} if
9434 %% on vient de finir une composante
9435 /result [result aload pop composante] store
9436 %% (nouvelle comp) == composante {==} apply
9437 table length 0 eq {exit} if
9440 % (renvoie) == result {==} apply
9444 /solideqplansepare {solidplansepare} def
9446 %% syntaxe : solid eqplan/plantype solidplansepare --> solid1 solid2
9455 eqplan true solidplansection
9456 /nbcomposantes exch def
9458 /n solid solidnombrefaces def
9462 %% on retire les faces de coupe
9463 0 1 nbcomposantes 1 sub {
9465 /F [F aload pop solid i solidgetface] store
9466 /FC [FC aload pop solid i solidgetfcolor] store
9468 solid [0 1 nbcomposantes 1 sub {} for] solidrmfaces
9469 /n n nbcomposantes sub store
9471 %% on separe les autres faces en 2 parties
9472 /lesneg [] def %% indices des faces "positives"
9473 /lespos [] def %% indices des faces negatives"
9476 solid i solidcentreface /G defpoint3d
9477 G eqplan pointeqplan dup 0 gt {
9479 /lespos [lespos aload pop i] store
9482 /lesneg [lesneg aload pop i] store
9484 % /lesneg [lesneg aload pop i] store
9485 % /lespos [lespos aload pop i] store
9490 dupsolid dup lesneg solidrmfaces
9492 dupsolid dup lespos solidrmfaces
9496 0 1 nbcomposantes 1 sub {
9498 /facecoupe F i get def
9499 /couleurfacecoupe FC i get def
9500 /lesfaces1 result1 solidgetfaces def
9501 /lescouleurs1 result1 solidgetfcolors def
9502 /IO1 result1 solidgetinouttable def
9503 /lesfaces2 result2 solidgetfaces def
9504 /lescouleurs2 result2 solidgetfcolors def
9505 /IO2 result2 solidgetinouttable def
9506 %% on rajoute maintenant la face du plan de coupe
9507 % result1 facecoupe couleurfacecoupe solidaddface
9508 result1 [facecoupe lesfaces1 aload pop] solidputfaces
9509 result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors
9510 result1 IO1 dup dup 1 get 1 add 1 exch put solidputinouttable
9511 %% et on verifie l'orientation
9512 % result1 dup solidnombrefaces 1 sub solidnormaleface
9513 % result1 dup solidnombrefaces 1 sub solidcentreface addv3d
9514 result1 0 solidnormaleface
9515 result1 0 solidcentreface addv3d
9516 eqplan pointeqplan 0 gt {
9517 %% l'orientation est mauvaise
9518 result1 0 solidrmface
9519 result2 [facecoupe lesfaces2 aload pop] solidputfaces
9520 result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors
9521 result2 IO2 dup dup 1 get 1 add 1 exch put solidputinouttable
9522 result1 [facecoupe reverse lesfaces1 aload pop] solidputfaces
9523 result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors
9524 result1 dup solidgetinouttable dup dup 1 get 1 add 1 exch put solidputinouttable
9526 %% l'orientation est ok
9527 result2 IO2 dup dup 1 get 1 add 1 exch put solidputinouttable
9528 result2 [facecoupe reverse lesfaces2 aload pop] solidputfaces
9529 result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors
9533 %% maintenant on enleve les sommets isoles
9536 %% pour chaque face du cote negatif
9537 0 1 lesneg length 1 sub {
9538 lesneg exch get /i exch def
9539 /F solid i solidgetface def
9540 %% pour chaque sommet de cette face
9541 0 1 F length 1 sub {
9544 %% si le sommet n'est pas encore note
9545 sommet sommetsneg in not {
9546 %% et s'il est isole, on peut l'enlever
9547 result1 sommet solidsommetsadjsommet length 0 eq {
9548 /sommetsneg [sommetsneg aload pop sommet] store
9555 sommetsneg bubblesort reverse {result1 exch solidrmsommet} apply
9557 %% pour chaque face du cote positif
9558 0 1 lespos length 1 sub {
9559 lespos exch get /i exch def
9560 /F solid i solidgetface def
9561 %% pour chaque sommet de cette face
9562 0 1 F length 1 sub {
9565 %% si le sommet n'est pas encore note
9566 sommet sommetspos in not {
9567 %% et s'il est isole, on peut l'enlever
9568 result2 sommet solidsommetsadjsommet length 0 eq {
9569 /sommetspos [sommetspos aload pop sommet] store
9576 sommetspos bubblesort reverse {result2 exch solidrmsommet} apply
9582 %%%%% ### solidaffine ###
9583 %% syntaxe : solid coeff i solidaffine -> -
9584 %% syntaxe : solid coeff array solidaffine -> -
9585 %% syntaxe : solid coeff solidaffine -> -
9586 %% syntaxe : solid coeff str solidaffine -> -
9587 %% syntaxe : solid coeff bool solidaffine -> -
9591 /rmfacecentrale exch def
9593 /rmfacecentrale true def
9596 /couleurface exch def
9598 2 copy pop issolid {
9599 %% 2 arguments --> on affine tout
9600 2 copy pop solidnombrefaces /n exch def
9601 /table [n 1 sub -1 0 {} for] def
9603 %% 1 tableau --> il donne les faces a enlever
9605 /table exch bubblesort reverse def
9607 %% 1 seule face a enlever
9608 [ exch ] /table exch def
9613 0 1 table length 1 sub {
9615 solid coeff table i get
9616 currentdict /couleurface known {
9619 rmfacecentrale s@lidaffineface
9624 %% syntaxe : solid coeff i s@lidaffineface
9627 /rmfacecentrale exch def
9629 /couleurface exch def
9631 /indice_a_chamfreiner exch def
9632 /i indice_a_chamfreiner def
9636 (Erreur : mauvais type d argument dans affine) ==
9639 /n solid solidnombresommets def
9640 /F solid i solidgetsommetsface def
9641 /Findex solid i solidgetface def
9642 /ni F length 3 idiv def
9643 /couleurfaceorigine solid i solidgetfcolor def
9644 F isobarycentre3d /G defpoint3d
9645 %% on ajoute les nouveaux sommets
9649 /Sindex [ Sindex aload pop
9650 solid G F j getp3d vecteur3d coeff mulv3d G addv3d solidaddsommet
9653 %% Sindex contient les indices des nouveaux sommets
9654 %% on prepare les faces a ajouter
9656 /facestoadd [facestoadd aload pop
9660 Findex j 1 add ni mod get
9661 Sindex j 1 add ni mod get
9667 solid facestoadd i get solidaddface
9669 %% on enleve la face d origine
9670 solid indice_a_chamfreiner solidrmface
9671 %% on ajuste les couleurs des nouvelles faces
9672 /N solid solidnombrefaces def
9675 solid N 1 sub i sub couleurfaceorigine solidputfcolor
9677 %% puis on ajoute eventuellement la face centrale
9678 rmfacecentrale not {
9685 %% en ajustant la couleur de cette derniere
9687 currentdict /couleurface known {
9697 %%%%% ### solidtronque ###
9698 %% syntaxe : solid indicesommet k solidtronque --> solid
9699 %% syntaxe : solid array k solidtronque --> solid
9700 %% syntaxe : solid k solidtronque --> solid
9701 %% k entier > 0, array = tableau des indices des sommets
9706 dup solidnombresommets /N exch def
9707 /table [0 1 N 1 sub {} for] def
9712 [ exch ] /table exch def
9716 solid dupsolid /result exch def pop
9717 /n solid solidnombrefaces def
9718 0 1 table length 1 sub {
9719 table exch get /no exch def
9720 result no solidgetsommet /sommetvise defpoint3d
9721 %% on recup les sommets adjacents au sommet vise
9722 /sommetsadj solid no solidsommetsadjsommet def
9723 %% on calcule les nouveaux sommets
9725 0 1 sommetsadj length 1 sub {
9727 solid sommetsadj i get solidgetsommet
9729 ] {sommetvise exchp3d coeff ABpoint3d} papply3d def
9730 %% on pose G = barycentre de ces points
9731 nouveauxsommets isobarycentre3d /G defpoint3d
9732 %% il faut ordonner ces sommets
9733 nouveauxsommets 0 getp3d /ptref defpoint3d
9734 G result no solidgetsommet vecteur3d /vecteurnormal defpoint3d
9735 %% on construit le tableau des angles ordonnes par rapport
9737 nouveauxsommets duparray exch pop
9742 vecteurnormal angle3doriente
9744 doublebubblesort pop
9745 %% nos sommets sont tries
9746 /indicesommetstries exch def
9747 %% on rajoute les sommets au solide, et on note les nouveaux indices
9749 0 1 nouveauxsommets length 3 idiv 1 sub {
9751 result nouveauxsommets k getp3d solidaddsommet
9754 %% on ajoute la face concernee
9756 0 1 indicesommetstries length 1 sub {
9758 nouveauxindices indicesommetstries k get get
9761 result no solidfacesadjsommet /lesfaces exch def
9762 %% on examine la face d indice i, et on elimine le
9764 0 1 lesfaces length 1 sub {
9766 /j lesfaces i get def
9767 /F result j solidgetface def
9769 0 1 F length 1 sub {
9771 F k get dup no eq {pop} if
9773 ] j exch solidputface
9776 table bubblesort reverse {result exch solidrmsommet} apply
9781 %%%%% ### dualpolyedre ###
9782 %% syntaxe : solid dualpolyedreregulier --> solid
9783 %% syntaxe : solid r dualpolyedreregulier --> solid
9784 %% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r
9785 /dualpolyedreregulier {
9789 /projection true def
9791 /projection false def
9794 solid dupsolid /result exch def pop
9795 /n solid solidnombrefaces def
9796 /N solid solidnombresommets def
9797 /facesaenlever [] def
9798 %% pour chacun des sommets
9800 %% sommet d indice i
9802 %% indicesfacesadj = liste des indices des faces ou on trouve le sommet i
9803 /indicesfacesadj solid i solidfacesadjsommet def
9804 %% on recupere les centres des faces concernees
9806 0 1 indicesfacesadj length 1 sub {
9808 solid indicesfacesadj k get solidgetsommetsface isobarycentre3d
9811 %% et on pose G = barycentre de ces points
9812 nouveauxsommets isobarycentre3d /G defpoint3d
9813 %% il faut ordonner ces sommets
9814 nouveauxsommets 0 getp3d /ptref defpoint3d
9815 G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d
9816 nouveauxsommets duparray exch pop
9821 vecteurnormal angle3doriente
9823 doublebubblesort pop
9824 %% nos sommets sont tries
9825 /indicesommetstries exch def
9827 %% on projette les sommets sur la sphere
9828 /nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store
9830 %% puis on les rajoute au solide
9832 0 1 nouveauxsommets length 3 idiv 1 sub {
9834 result nouveauxsommets k getp3d solidaddsommet
9837 %% ainsi que la face concernee
9839 0 1 indicesommetstries length 1 sub {
9841 nouveauxindices indicesommetstries k get get
9844 /facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store
9846 result [0 1 n 1 sub {} for] solidrmfaces
9847 [N 1 sub -1 0 {} for] {result exch solidrmsommet} apply
9852 %%%%% ### newgeode ###
9853 %% syntaxe : solid r newgeode --> solid
9854 %% syntaxe : N r newgeode --> solid
9855 %% N in {3,4,5} -> polyhedre de depart, r = niveau de recursion
9875 solid dupsolid /result exch def pop
9876 /n solid solidnombrefaces def
9879 %% la face d indice i
9880 solid i solidgetface /F exch def
9884 solid i0 solidgetsommet /A0 defpoint3d
9885 solid i1 solidgetsommet /A1 defpoint3d
9886 solid i2 solidgetsommet /A2 defpoint3d
9887 A0 A1 milieu3d normalize3d /A01 defpoint3d
9888 A1 A2 milieu3d normalize3d /A12 defpoint3d
9889 A2 A0 milieu3d normalize3d /A20 defpoint3d
9890 result A01 solidaddsommet /i01 exch def
9891 result A12 solidaddsommet /i12 exch def
9892 result A20 solidaddsommet /i20 exch def
9893 result i solidrmface
9894 result [i0 i01 i20] solidaddface
9895 result [i01 i1 i12] solidaddface
9896 result [i01 i12 i20] solidaddface
9897 result [i20 i12 i2] solidaddface
9905 %% syntaxe : N r newdualgeode --> solid
9908 dualpolyedreregulier
9911 %%%%% ### fin insertion ###
9914 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9915 %%%% quelques solides precalcules %%%%
9916 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9918 %%%%% ### newface ###
9919 %% syntaxe : array newmonoface -> solid
9920 %% ou array = tableau de points 2d
9924 /n table length 2 idiv def
9925 /S table {0} papply def
9928 [0 1 n 1 sub {} for]
9934 %% syntaxe : array newbiface -> solid
9935 %% ou array = tableau de points 2d
9941 %%%%% ### newpolreg ###
9942 %% syntaxe : r n newpolreg --> solid
9948 0 360 n div 360 360 n div sub {
9956 [0 1 n 1 sub {} for]
9964 %%%%% ### newgrille ###
9965 %% syntaxe : xmin xmax ymin ymax [dx dy] newgrille -> solid
9966 %% syntaxe : xmin xmax ymin ymax [nx ny] newgrille -> solid
9967 %% syntaxe : xmin xmax ymin ymax {mode} newgrille -> solid
9968 %% syntaxe : xmin xmax ymin ymax newgrille -> solid
9971 [[/nx /ny] [1 1] [1. 1.] [1. 1.] [1. 1.] [.5 .5]] gestionsolidmode
9972 %% ny nb d etages en y
9973 %% nx nb d etages en x
9975 [nx ny] {0} newsurfaceparametree
9979 %% %% syntaxe : xmin xmax ymin ymax [dx dy] {f} newsurface -> solid
9982 true newsurfaceparametree
9987 /newsurfaceparametree {
9995 [[/nx /ny] [2 2] [4 4] [1. 1.] [1. 1.] [.25 .25]] gestionsolidmode
9996 %% ny nb d etages en y
9997 %% nx nb d etages en x
10004 %% alors nx est un dx
10005 /nx xmax xmin sub nx div cvi store
10008 %% alors ny est un dy
10009 /ny ymax ymin sub ny div cvi store
10011 /dy ymax ymin sub ny div def %% le pas sur y
10012 /dx xmax xmin sub nx div def %% le pas sur x
10019 /u xmin i dx mul add def
10020 /v ymin j dy mul add def
10035 j 1 add i ny 1 add mul add
10036 j i ny 1 add mul add
10037 j ny 1 add add i ny 1 add mul add
10038 j ny 2 add add i ny 1 add mul add
10042 %% 0 1 0 {%nx 1 sub {
10044 %% 0 1 0 {%ny 2 sub {
10047 %% j 1 add %% i ny mul add
10048 %% j %% i ny mul add
10049 %% ny 1 add j add %% i ny mul add
10050 %% ny 2 add j add %% i ny mul add
10056 biface pl@n-en-cours not and {dup videsolid} if
10060 %%%%% ### newgrillecirculaire ###
10061 %% syntaxe : r option newgrillecirculaire -> solid
10062 /newgrillecirculaire {
10064 [[/K /N] [6 6] [6 8] [10 8] [16 12] [16 36]] gestionsolidmode
10066 %% N = nb de meridiens (diviseur de 360 = 2^4 * 3^2 * 5)
10067 %% K = nb d horizontales (diviseur de 160 = 2^5 * 5)
10074 [0 i i N mod 1 add]
10082 i N add j N mul add
10083 i N mod N add 1 add j N mul add
10084 i N mod 1 add j N mul add]
10089 %% tableau des sommets
10096 /theta i 360 mul N div def
10097 theta cos r j mul K div mul
10098 theta sin r j mul K div mul
10099 0 %2 copy f %exch atan 90 div
10108 %% syntaxe : r [dx dy] {f} newsurface* -> solid
10111 /f_surface exch def
10112 [[/nx /ny] [6 6] [6 8] [10 8] [16 12] [16 36]] gestionsolidmode
10115 %% alors nx est un dx
10116 /nx xmax xmin sub nx div cvi store
10119 %% alors ny est un dy
10120 /ny ymax ymin sub ny div cvi store
10122 /dy ymax ymin sub ny div def %% le pas sur y
10123 /dx xmax xmin sub nx div def %% le pas sur x
10125 %% ny = nb de meridiens
10126 %% nx = nb d horizontales
10133 [0 i i ny mod 1 add]
10141 i ny add j ny mul add
10142 i ny mod ny add 1 add j ny mul add
10143 i ny mod 1 add j ny mul add]
10148 %% tableau des sommets
10155 /theta i 360 mul ny div def
10156 theta cos r j mul nx div mul
10157 theta sin r j mul nx div mul
10167 %%%%% ### newruban ###
10168 %% syntaxe : array h u [n] newruban -> solid d axe (O, u), de maillage vertical n
10169 %% syntaxe : array h u newruban -> solid d axe (O, u),
10170 %% syntaxe : array h newruban -> solid d axe (O, k),
10171 %% ou array tableau de points 2d
10175 [[/N] [1] [1] [1] [3] [4]] gestionsolidmode
10176 2 copy pop isarray {
10182 (Error : 3eme composante nulle dans le vecteur pour newruban) ==
10188 %% n = indice du dernier point
10189 /n table length 2 idiv 1 sub def
10190 %% vecteur de translation
10193 mulv3d /v defpoint3d
10195 %% tableau des sommets
10203 v N j sub N div mulv addv3d
10214 [i j 1 sub n 1 add mul add
10215 i 1 sub j 1 sub n 1 add mul add
10216 n 1 add i add 1 sub j 1 sub n 1 add mul add
10217 n 1 add i add j 1 sub n 1 add mul add]
10227 %%%%% ### newicosaedre ###
10232 0.8944271 0 0.4472137
10233 0.2763932 0.8506507 0.4472137
10234 -0.7236067 0.5257311 0.4472137
10235 -0.7236067 -0.5257311 0.4472137
10236 0.2763932 -0.8506507 0.4472137
10239 -0.8944271 0 -0.4472137
10240 -0.2763932 -0.8506507 -0.4472137
10241 0.7236067 -0.5257311 -0.4472137
10242 0.7236067 0.5257311 -0.4472137
10243 -0.2763932 0.8506507 -0.4472137
10244 ] {a mulv3d} papply3d def
10252 [9 0 4] %% 10 1 5 ]
10253 [0 9 10] %% 1 10 11]
10254 [10 1 0] %% 11 2 1 ]
10255 [1 10 11] %% 2 11 12]
10256 [11 2 1] %% 12 3 2 ]
10257 [2 11 7] %% 3 12 8 ]
10261 [4 8 9] %% 5 9 10 ]
10262 [6 7 11] %% 7 8 12 ]
10264 [6 9 8] %% 7 10 9 ]
10265 [6 10 9] %% 7 11 10]
10266 [6 11 10] %% 7 12 11]
10273 %%%%% ### newdodecaedre ###
10278 0 0.607062 0.7946545
10279 -0.5773503 0.1875925 0.7946545
10280 -0.3568221 -0.4911235 0.7946545
10281 0.3568221 -0.4911235 0.7946545
10282 0.5773503 0.1875925 0.7946545
10283 0 0.982247 0.1875925
10284 -0.9341724 0.303531 0.1875925
10285 -0.5773503 -0.7946645 0.1875925
10286 0.5773503 -0.7946645 0.1875925
10287 0.9341724 0.303531 0.1875925
10288 0 -0.982247 -0.1875925
10289 0.9341724 -0.303531 -0.1875925
10290 0.5773503 0.7946545 -0.1875925
10291 -0.5773503 0.7946545 -0.1875925
10292 -0.9341724 -0.303531 -0.1875925
10293 -0.5773503 -0.1875925 -0.7946545
10294 -0.3568221 0.4911235 -0.7946545
10295 0.3568221 0.4911235 -0.7946545
10296 0.5773503 -0.1875925 -0.7946545
10297 0 -0.607062 -0.7946545
10298 ] {a mulv3d} papply3d def
10318 %%%%% ### newoctaedre ###
10330 ] {a mulv3d} papply3d def
10347 %%%%% ### newtetraedre ###
10354 -0.4714045 -0.8164965 -1 3 div
10355 0.942809 0 -1 3 div
10356 -0.4714045 0.8164965 -1 3 div
10357 ] {r mulv3d} papply3d def
10370 %%%%% ### newcube ###
10373 [[/n] [1] [1] [1] [3] [4]] gestionsolidmode
10386 %% tableau des sommets
10396 ] {a mulv3d} papply3d def
10400 /N n dup mul n add 4 mul def
10401 /n1 n 1 sub dup mul def %% nb sommets centre d une face
10403 %% tableau des sommets
10416 /S2 S1 {-90 0 0 rotateOpoint3d} papply3d def
10417 /S3 S2 {-90 0 0 rotateOpoint3d} papply3d def
10418 /S4 S3 {-90 0 0 rotateOpoint3d} papply3d def
10444 %% tableau des faces
10451 i n 1 add j mul add
10460 %% syntaxe : i sommettourgauche --> l indice du i-eme sommet du tour
10461 %% de la face gauche (en commencant par l indice 0). ATTENTION :
10462 %% utilise la variable globale n = nb d etages
10463 /sommettourgauche {
10468 (Error: indice trop grand dans sommettourgauche) ==
10471 n n 1 add i mul add
10475 %% syntaxe : i sommetcentregauche --> l indice du i-eme sommet du centre
10476 %% de la face gauche (en commencant par l indice 0). ATTENTION :
10477 %% utilise les variables globales n = nb d etages, et N = nb sommets
10478 %% des 4 1eres faces
10479 /sommetcentregauche {
10482 i n 1 sub dup mul ge {
10484 (Error: indice trop grand dans sommetcentregauche) ==
10492 %%%%% la face gauche %%%%%
10493 %% le coin superieur gauche
10497 n 4 mul 1 sub sommettourgauche
10498 n1 n 1 sub sub sommetcentregauche
10501 %% la bande superieure (i from 1 to n-2)
10505 i 1 add sommettourgauche
10507 n1 n sub i add sommetcentregauche
10508 n1 n sub i 1 add add sommetcentregauche
10512 %% le coin superieur droit
10515 n 1 sub sommettourgauche
10516 n1 1 sub sommetcentregauche
10517 n 1 add sommettourgauche
10520 %% la descente gauche
10525 n1 n 1 sub j mul sub sommetcentregauche
10526 n 4 mul j sub sommettourgauche
10527 n 4 mul j 1 add sub sommettourgauche
10528 n1 n 1 sub j 1 add mul sub sommetcentregauche
10532 %% les bandes centrales (j from 1 to n-2 et i from 1 to n-2)
10538 n1 i n 1 sub j 1 sub mul add sub sommetcentregauche
10539 n1 i 1 add n 1 sub j 1 sub mul add sub sommetcentregauche
10540 n1 i 1 add n 1 sub j mul add sub sommetcentregauche
10541 n1 i n 1 sub j mul add sub sommetcentregauche
10546 %% la descente droite
10550 n j add sommettourgauche
10551 n1 1 sub j 1 sub n 1 sub mul sub sommetcentregauche
10552 n1 1 sub j n 1 sub mul sub sommetcentregauche
10553 n j 1 add add sommettourgauche
10557 %% le coin inferieur gauche
10559 0 sommetcentregauche
10560 n 3 mul 1 add sommettourgauche
10561 n 3 mul sommettourgauche
10562 n 3 mul 1 sub sommettourgauche
10565 %% la bande inferieure (i from 1 to n-2)
10569 i sommetcentregauche
10570 i 1 sub sommetcentregauche
10571 n 3 mul i sub sommettourgauche
10572 n 3 mul i sub 1 sub sommettourgauche
10576 %% le coin inferieur droit
10578 n 2 mul 1 sub sommettourgauche
10579 n 2 sub sommetcentregauche
10580 n 2 mul 1 add sommettourgauche
10581 n 2 mul sommettourgauche
10585 %% syntaxe : i sommettourdroit --> l indice du i-eme sommet du tour
10586 %% de la face droit (en commencant par l indice 0). ATTENTION :
10587 %% utilise la variable globale n = nb d etages
10593 (Error: indice trop grand dans sommettourdroit) ==
10600 %% syntaxe : i sommetcentredroit --> l indice du i-eme sommet du centre
10601 %% de la face droit (en commencant par l indice 0). ATTENTION :
10602 %% utilise les variables globales n = nb d etages, et N = nb sommets
10603 %% des 4 1eres faces
10604 /sommetcentredroit {
10607 i n 1 sub dup mul ge {
10609 (Error: indice trop grand dans sommetcentredroit) ==
10617 %% coin superieur droit
10621 n1 n 1 sub sub sommetcentredroit
10622 4 n mul 1 sub sommettourdroit
10624 %% coin superieur gauche
10626 n 1 sub sommettourdroit
10628 n 1 add sommettourdroit
10629 n1 1 sub sommetcentredroit
10631 %% coin inferieur gauche
10633 n 2 sub sommetcentredroit
10634 2 n mul 1 sub sommettourdroit
10635 2 n mul sommettourdroit
10636 2 n mul 1 add sommettourdroit
10638 %% coin inferieur droit
10640 3 n mul 1 add sommettourdroit
10641 0 sommetcentredroit
10642 3 n mul 1 sub sommettourdroit
10643 3 n mul sommettourdroit
10645 %% bande superieure
10650 i 1 add sommettourdroit
10651 n 1 sub n 2 sub mul i add sommetcentredroit
10652 n 1 sub n 2 sub mul i 1 sub add sommetcentredroit
10655 %% bande inferieure
10659 i 1 sub sommetcentredroit
10660 i sommetcentredroit
10661 3 n mul 1 sub i sub sommettourdroit
10662 3 n mul i sub sommettourdroit
10669 n1 1 sub i 1 sub n 1 sub mul sub sommetcentredroit
10670 n i add sommettourdroit
10671 n i 1 add add sommettourdroit
10672 n1 1 sub i n 1 sub mul sub sommetcentredroit
10679 4 n mul i sub sommettourdroit
10680 n 1 sub n 1 sub i sub mul sommetcentredroit
10681 n 1 sub n 2 sub i sub mul sommetcentredroit
10682 4 n mul i sub 1 sub sommettourdroit
10685 %% bandes interieures
10691 n 1 sub j mul i 1 sub add sommetcentredroit
10692 n 1 sub j mul i add sommetcentredroit
10693 n 1 sub j 1 sub mul i add sommetcentredroit
10694 n 1 sub j 1 sub mul i 1 sub add sommetcentredroit
10701 /F2 F1 {{n dup mul n add add} apply} apply def
10702 /F3 F2 {{n dup mul n add add} apply} apply def
10703 /F4 F3 {{n dup mul n add add} apply} apply def
10706 S1 S2 append S3 append S4 append S5 append S6 append {a mulv3d} papply3d
10707 F1 F2 append F3 append F4 append {{N mod} apply} apply F5 append F6 append
10713 %%%%% ### newparallelepiped ###
10715 /newparallelepiped {
10729 %% tableau des sommets
10737 a neg b neg c neg %% 6
10743 %%%%% ### newcylindre ###
10744 %% syntaxe : z0 r0 z1 newcylindre -> solide
10745 %% syntaxe : z0 r0 z1 {mode} newcylindre -> solide
10746 %% syntaxe : z0 r0 z1 [n1 n2] newcylindre -> solide
10747 %% syntaxe : a b {f} {u} h [n1 n2] newcylindre
10750 [[/n2 /n1] [1 6] [1 8] [1 10] [3 12] [5 18]] gestionsolidmode
10751 2 copy pop xcheck {
10752 %% cylindre cas general
10755 U normalize3d /u defpoint3d
10756 /lafonction exch def
10759 /pas b a sub n1 div def
10766 a i pas mul add lafonction
10767 u j vpas mul mulv3d addv3d
10777 i n1 1 add j mul add
10789 %% cylindre de revolution
10790 2 copy pop [n2 n1] newtronccone
10795 %% syntaxe : z0 r0 z1 newcylindrecreux -> solide
10796 /newcylindrecreux {
10801 %%%%% ### newtronccone ###
10802 %% syntaxe : z0 r0 z1 r1 newtronccone -> solid
10805 [[/n /N] [1 6] [1 8] [1 10] [3 12] [5 18]] gestionsolidmode
10811 /dz z1 z0 sub n div def
10812 /dr r1 r0 sub n div def
10815 [0 1 N 1 sub {} for]
10816 [n 1 add N mul 1 sub -1 n N mul {} for]
10820 k N mul 1 add 1 k 1 add N mul 1 sub {
10822 [i i 1 sub N i add 1 sub N i add]
10824 [k N mul k 1 add N mul 1 sub k 2 add N mul 1 sub k 1 add N mul]
10829 %% tableau des sommets
10835 360 N idiv i mul cos r0 dr k mul add mul
10836 360 N idiv i mul sin r0 dr k mul add mul
10845 %% syntaxe : z0 r0 z1 r1 newtroncconecreux -> solid
10846 /newtroncconecreux {
10851 %%%%% ### newcone ###
10852 %% syntaxe : z0 r0 z1 newcone -> solid
10853 %% syntaxe : z0 r0 z1 {mode} newcone -> solid
10854 %% syntaxe : z0 r0 z1 [n1 n2] newcone -> solid
10855 %% syntaxe : a b {f} {sommet} [n1 n2] newcone -> solid
10858 [ [/n /N] [1 6] [1 8] [1 10] [3 12] [5 18] ] gestionsolidmode
10862 /lafonction exch def
10866 /pas b a sub N div def
10873 a i pas mul add lafonction
10874 dupp3d sommet vecteur3d j n div mulv3d addv3d
10881 a i pas mul add lafonction
10882 sommet vecteur3d j n div mulv3d sommet addv3d
10888 %% les etages inferieurs
10894 i j N 1 add mul add
10901 %% dernier etage inferieur
10905 i N 1 add n 1 sub mul add
10910 %% premier etage superieur
10914 i N 1 add n mul add
10920 %% les etages superieurs
10921 n 1 n 2 mul 2 sub {
10926 i j N 1 add mul add
10938 %% cylindre de revolution
10942 /dz z1 z0 sub n div def
10947 [N 1 sub -1 0 {} for]
10948 %% le dernier etage
10949 n 1 sub N mul 1 add 1 n N mul 1 sub {
10951 [i 1 sub i n N mul]
10953 [n N mul 1 sub n 1 sub N mul n N mul]
10954 %% les autres etages
10957 0 N j mul add 1 N N j mul add 2 sub {
10959 [i i 1 add dup N add dup 1 sub]
10961 [N N j mul add 1 sub N j mul dup N add dup N add 1 sub]
10965 %% tableau des sommets
10967 %% etage no j (in [1; n])
10972 360 N idiv i mul cos r0 dr j mul sub mul
10973 360 N idiv i mul sin r0 dr j mul sub mul
10984 %% %% syntaxe : z0 r0 z1 newconecreux -> solid
10991 %%%%% ### newtore ###
10992 %% syntaxe : r R newtore -> solid
10995 [[/n1 /n2] [4 5] [6 10] [8 12] [9 18] [18 36]] gestionsolidmode
11003 360 n1 div i mul cos r mul R add
11004 360 n1 div i mul sin r mul
11012 %%%%% ### newprisme ###
11013 %% syntaxe : array z0 z1 newprisme -> solid d axe (O, u),
11015 [[/N] [1] [1] [1] [3] [6]] gestionsolidmode
11016 0 0 1 [N] newprisme
11019 %% syntaxe : array z0 z1 u newprisme -> solid d axe (O, u),
11020 %% ou array tableau de points 2d
11023 [[/N] [1] [1] [1] [3] [6]] gestionsolidmode
11025 (Error : 3eme composante nulle dans le vecteur pour newprisme) ==
11033 %% n = indice du dernier point
11034 /n table length 2 idiv 1 sub def
11035 %% vecteur de translation
11037 z1 z0 sub u norme3d div
11038 mulv3d /v defpoint3d
11040 %% tableau des sommets
11048 v N j sub N div mulv addv3d
11057 [N 1 add n 1 add mul 1 sub -1 N n 1 add mul {} for]
11063 [i j 1 sub n 1 add mul add
11064 i 1 sub j 1 sub n 1 add mul add
11065 n 1 add i add 1 sub j 1 sub n 1 add mul add
11066 n 1 add i add j 1 sub n 1 add mul add]
11068 [0 j 1 sub n 1 add mul add
11069 n j 1 sub n 1 add mul add
11070 2 n mul 1 add j 1 sub n 1 add mul add
11071 n 1 add j 1 sub n 1 add mul add]
11079 %%%%% ### newsphere ###
11080 %% syntaxe : r option newsphere -> solid
11083 [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
11084 -90 90 [K N] newcalottesphere
11088 %% syntaxe : r phi theta option newcalottesphere -> solid
11089 /newcalottesphere {
11091 [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
11093 %% test de beta (ex-theta)
11098 /beta exch 80 min -80 max def
11101 %% test de alpha (ex-phi)
11105 /alpha exch beta min -80 max def
11111 /db alpha beta sub K 1 add div def
11114 /db alpha beta sub K div def
11119 /db alpha beta sub K div def
11122 /db alpha beta sub K 1 sub div def
11126 %% nombre de sommets -2
11129 %% tableau des sommets
11133 /phi beta j db mul add def
11134 phi cos r mul /r_tmp exch def
11137 360 N idiv i mul cos r_tmp mul
11138 360 N idiv i mul sin r_tmp mul
11147 %% calotte inferieure
11157 [nb nb N sub nb 1 sub]
11159 [nb 1 sub -1 nb N sub {} for ]
11162 %% calotte superieure
11166 [i i 1 add N mod N K mul 1 add]
11169 [0 1 N 1 sub {} for]
11177 j 1 sub N mul 1 add
11180 N 2 sub {dup {1 add} apply} repeat
11182 j 1 add N mul 1 sub
11194 %% syntaxe : r phi theta option newcalottespherecreuse -> solid
11195 /newcalottespherecreuse {
11197 [[/K /N] [6 6] [8 8] [10 12] [16 12] [16 36]] gestionsolidmode
11199 %% test de beta (ex-theta)
11204 /beta exch 80 min -80 max def
11207 %% test de alpha (ex-phi)
11211 /alpha exch beta min -80 max def
11217 /db alpha beta sub K 1 add div def
11220 /db alpha beta sub K div def
11225 /db alpha beta sub K div def
11228 /db alpha beta sub K 1 sub div def
11232 %% nombre de sommets -2
11235 %% tableau des sommets
11239 /phi beta j db mul add def
11240 phi cos r mul /r_tmp exch def
11243 360 N idiv i mul cos r_tmp mul
11244 360 N idiv i mul sin r_tmp mul
11253 %% calotte inferieure
11263 [nb nb N sub nb 1 sub]
11265 % [nb 1 sub -1 nb N sub {} for ]
11268 %% calotte superieure
11272 [i i 1 add N mod N K mul 1 add]
11275 % [0 1 N 1 sub {} for]
11283 j 1 sub N mul 1 add
11286 N 2 sub {dup {1 add} apply} repeat
11288 j 1 add N mul 1 sub
11301 %%%%% ### newanneau ###
11302 %% syntaxe : array n newanneau --> solid
11303 %% syntaxe : array {mode} newanneau --> solid
11304 %% ou array est un tableau de points de R^2 et n un nombre entier positif
11311 [[/n2] [6] [12] [24] [32] [36]] gestionsolidmode
11313 %% on plonge la section dans R^3 par projection sur yOz
11314 /S1 exch {0 3 1 roll} papply def
11315 %% nombre de sommets
11316 /n1 S1 length 3 idiv def
11321 {0 0 360 n2 div rotateOpoint3d} papply3d
11329 n1 j mul 1 j 1 add n1 mul 2 sub {
11331 [i 1 add i dup n1 add i n1 1 add add]
11333 [n1 j mul j 1 add n1 mul 1 sub j 2 add n1 mul 1 sub j 1 add n1 mul]
11341 %%%%% ### newvecteur ###
11342 %% syntaxe : x y z newvecteur
11343 %% syntaxe : x y z array newvecteur
11348 /h@uteur table 1 get def
11349 /r@y@n table 0 get def
11362 normalvect_to_orthobase
11367 A norme3d /z exch h@uteur sub def
11368 0 r@y@n h@uteur [1 8] newcone
11369 dup (noir) outputcolors
11370 {0 0 z translatepoint3d} solidtransform
11371 {imI imJ imK transformpoint3d} solidtransform
11376 %%%%% ### readsolidfile ###
11377 %% syntaxe : str readsolidfile -> solid
11381 [str (-sommets.dat) append run]
11382 [str (-faces.dat) append run]
11384 dup [str (-couleurs.dat) append run] solidputfcolors
11385 dup [str (-io.dat) append run] solidputinouttable
11389 %%%%% ### writesolidfile ###
11390 %% syntaxe : solid str writesolidfile -> -
11395 solid issolid not {
11396 (Error : mauvais type d argument dans writesolidfile) ==
11399 str (-sommets.dat) append (w) file /lefichiersommets exch def
11400 str (-faces.dat) append (w) file /lefichierfaces exch def
11401 str (-couleurs.dat) append (w) file /lefichiercouleurs exch def
11402 str (-io.dat) append (w) file /lefichierio exch def
11404 /S solid solidgetsommets def
11405 0 1 S length 3 idiv 1 sub {
11407 solid i solidgetsommet
11411 lefichiersommets x chaine cvs writestring
11412 lefichiersommets 32 write %% espace
11413 lefichiersommets y chaine cvs writestring
11414 lefichiersommets 32 write %% espace
11415 lefichiersommets z chaine cvs writestring
11416 lefichiersommets 10 write %% CR
11418 lefichiersommets closefile
11420 /F solid solidgetfaces def
11421 0 1 F length 1 sub {
11423 /Fi solid i solidgetface def
11424 lefichierfaces 91 write %% [
11425 0 1 Fi length 1 sub {
11427 lefichierfaces Fi j get chaine cvs writestring
11428 lefichierfaces 32 write %% espace
11430 lefichierfaces 93 write %% ]
11431 lefichierfaces 10 write %% CR
11433 lefichierfaces closefile
11435 /C solid solidgetfcolors def
11436 0 1 C length 1 sub {
11438 lefichiercouleurs 40 write %% (
11439 lefichiercouleurs C i get writestring
11440 lefichiercouleurs 41 write %% )
11441 lefichiercouleurs 10 write %% CR
11443 lefichiercouleurs closefile
11445 /IO solid solidgetinouttable def
11448 lefichierio IO i get chaine cvs writestring
11449 lefichierio 32 write %% space
11451 lefichierio closefile
11455 %%%%% ### writeobjfile ###
11456 %% syntaxe : solid str writeobjfile -> -
11459 /str exch (.obj) append def
11461 solid issolid not {
11462 (Erreur : mauvais type d argument dans writeobjfile) ==
11465 /n solid solidnombresommets def
11466 str (w) file /lefichier exch def
11469 solid i solidgetsommet
11473 lefichier (v ) writestring
11474 lefichier x chaine cvs writestring
11475 lefichier 32 write %% espace
11476 lefichier y chaine cvs writestring
11477 lefichier 32 write %% espace
11478 lefichier z chaine cvs writestring
11479 lefichier 10 write %% CR
11481 /n solid solidnombrefaces def
11484 lefichier (f ) writestring
11485 /F solid i solidgetface {1 add} apply def
11488 chaine cvs writestring
11489 lefichier 32 write %% espace
11491 lefichier 10 write %% CR
11493 lefichier closefile
11497 %%%%% ### writeofffile ###
11498 %% syntaxe : solid str writeobjfile -> -
11501 /str exch (.off) append def
11503 solid issolid not {
11504 (Erreur : mauvais type d argument dans writeofffile) ==
11507 /n solid solidnombresommets def
11508 /nf solid solidnombrefaces def
11509 str (w) file /lefichier exch def
11510 lefichier (OFF) writestring
11511 lefichier 10 write %% CR
11512 lefichier n chaine cvs writestring
11513 lefichier 32 write %% espace
11514 lefichier nf chaine cvs writestring
11515 lefichier 32 write %% espace
11516 lefichier 0 chaine cvs writestring
11517 lefichier 10 write %% CR
11520 solid i solidgetsommet
11524 lefichier z chaine cvs writestring
11525 lefichier 32 write %% espace
11526 lefichier y chaine cvs writestring
11527 lefichier 32 write %% espace
11528 lefichier x chaine cvs writestring
11529 lefichier 10 write %% CR
11533 /F solid i solidgetface def
11534 lefichier F length chaine cvs writestring
11535 lefichier 32 write %% espace
11538 chaine cvs writestring
11539 lefichier 32 write %% espace
11541 lefichier 10 write %% CR
11543 lefichier closefile
11547 %%%%% ### newobjfile ###
11550 /objfilename exch (.obj) append def
11556 ] %% ferme les sommets
11557 [ [ %% ouvre les faces
11562 [ %% ouvre la nouvelle
11565 [ 0 0 0 %% sommet fantome pour respecter l'indexation (a partir de l'indice 1)
11576 %%%%% ### newofffile ###
11580 /offfilename exch (.off) append def
11581 offfilename (r) file
11583 offfile str readline pop pop
11584 offfile str readline pop
11586 dup 0 get /ns exch def
11589 offfile str readline pop numstr2array aload pop
11595 offfile str readline pop numstr2array
11597 1 1 table length 1 sub {
11610 %%%%% ### newtube ###
11611 /tub@dernierk1 [1 0 0] def
11612 /tub@dernierk2 [0 1 0] def
11613 /tub@dernierk3 [0 0 1] def
11617 normalize3d /vect3 defpoint3d
11618 normalize3d /vect2 defpoint3d
11619 normalize3d /vect1 defpoint3d
11620 vect1 norme3d 0 eq {
11621 vect2 vect3 vectprod3d /vect1 defpoint3d
11623 vect2 norme3d 0 eq {
11624 vect3 vect1 vectprod3d /vect2 defpoint3d
11626 vect3 norme3d 0 eq {
11627 vect1 vect2 vectprod3d /vect3 defpoint3d
11629 /tub@dernierk1 [vect1] store
11630 /tub@dernierk2 [vect2] store
11631 /tub@dernierk3 [vect3] store
11635 %% syntaxe : tmin tmax (f) array r newtube -> solid
11640 /K table 0 get def %% nb d etages
11641 /N table 1 get def %% nb de points sur le perimetre
11642 /@r exch def %% le rayon du tube
11644 /lafonction str cvx def
11645 /laderivee str (') append cvx def
11646 %% /laderivee2nd str ('') append cvx def
11649 /pas tmax tmin sub K 1 sub div def
11651 %% definition des sommets
11655 /a0 tmin @k pas mul add def
11657 %% definition du repere de Frenet (k1, k2, k3) au point f(a)
11658 a0 lafonction /M defpoint3d
11660 str (') append cvlit where {
11662 a0 laderivee normalize3d /k1 defpoint3d
11663 % pop /avecderiv true def
11665 M a0 pas 100 div add lafonction vecteur3d normalize3d /k1 defpoint3d
11669 k1 baseplannormal /K3 defpoint3d /K2 defpoint3d
11670 % a0 laderivee2nd normalize3d /k2 defpoint3d
11672 %% projete orthogonal du dernier rayon sur le plan actuel
11673 %% (normal a la vitesse)
11674 K2 tub@dernierk2 aload pop K2 scalprod3d mulv3d
11675 K3 tub@dernierk2 aload pop K3 scalprod3d mulv3d addv3d /k2 defpoint3d
11676 % M k1 K2 K3 dessinebase
11678 tub@dernierk1 aload pop /k1 defpoint3d
11680 /tub@dernierk1 [k1] store
11683 tub@dernierk2 aload pop /k2 defpoint3d
11685 /tub@dernierk2 [k2] store
11687 k1 k2 vectprod3d normalize3d /k3 defpoint3d
11689 tub@dernierk3 aload pop /k3 defpoint3d
11691 /tub@dernierk3 [k3] store
11693 k3 k1 vectprod3d normalize3d /k2 defpoint3d
11694 %% M k1 k2 k3 dessinebase
11695 /tub@dernierk2 [k2] store
11696 /@n 360 N div def %% le pas angulaire
11700 k2 @i cos @r mul mulv3d addv3d
11701 k3 @i sin @r mul mulv3d addv3d
11707 dup length 3 idiv /nb exch def
11708 %% definition des faces
11711 [N 1 sub -1 0 {} for]
11713 [nb 1 sub N 1 sub {dup 1 sub} repeat] reverse
11722 i 1 add N mod N j mul add
11723 i 1 add N mod N add N j mul add
11724 i N add N j mul add
11734 %%%%% ### newcourbe ###
11735 %% syntaxe : a b {f} array newcourbe --> solid
11746 /pas b a sub n 1 sub div def
11765 %%%%% ### baseplannormal ###
11766 %% syntaxe : x y z baseplannormal -> x1 y1 z1 x2 y2 z2
11770 1 0 0 K vectprod3d normalize3d /U defpoint3d
11772 0 1 0 K vectprod3d normalize3d /U defpoint3d
11774 K U vectprod3d normalize3d /V defpoint3d
11779 %%%%% ### fin insertion ###
11781 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11782 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11784 %%%% fin insertion librairie jps %%%%
11786 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11787 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11789 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11790 %%%% gestion de chaine de caracteres %%%%
11791 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11793 /Times-Roman findfont
11794 dup length dict begin
11801 /Encoding ISOLatin1Encoding def
11804 /Times-Roman-ISOLatin1 exch definefont pop
11807 /Times-Roman-ISOLatin1 findfont
11816 %% syntaxe : string x y cctext
11827 wx -2 div wy -2 div rmoveto
11833 /dbtext {gsave newpath dbtext_ Fill grestore} def
11834 /dctext {gsave newpath dctext_ Fill grestore} def
11835 /dltext {gsave newpath dltext_ Fill grestore} def
11836 /drtext {gsave newpath drtext_ Fill grestore} def
11838 /bbtext {gsave newpath bbtext_ Fill grestore} def
11839 /bctext {gsave newpath bctext_ Fill grestore} def
11840 /bltext {gsave newpath bltext_ Fill grestore} def
11841 /brtext {gsave newpath brtext_ Fill grestore} def
11843 /cbtext {gsave newpath cbtext_ Fill grestore} def
11844 /cctext {gsave newpath cctext_ Fill grestore} def
11845 /cltext {gsave newpath cltext_ Fill grestore} def
11846 /crtext {gsave newpath crtext_ Fill grestore} def
11848 /ubtext {gsave newpath ubtext_ Fill grestore} def
11849 /uctext {gsave newpath uctext_ Fill grestore} def
11850 /ultext {gsave newpath ultext_ Fill grestore} def
11851 /urtext {gsave newpath urtext_ Fill grestore} def
11854 %% syntaxe : str x y show_dim --> str x y llx lly wx wy
11855 %% attention, doit laisser la pile intacte
11860 true charpath flattenpath pathbbox
11865 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11866 %%%% procedures pour PSTricks %%%%
11867 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11869 %%% les 3 procedures utilisees pour transformer les depots de AlgToPs en nombres
11882 exec exch exec exch
11889 /gere_pst-deffunction {
11906 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11907 %%%% procedures pour \psSolid %%%%
11908 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11912 /draw {drawsolid} def
11913 /draw* {drawsolid*} def
11914 /draw** {drawsolid**} def
11915 /writeobj {solidfilename writeobjfile} def
11916 /writesolid {solidfilename writesolidfile} def
11917 /writeoff {solidfilename writeofffile} def
11919 /vecteur_en_c@urs false def
11921 /gere_pstricks_color_inout {
11923 dup [fillincolor] (setrgbcolor) astr2str
11924 [fillcolor] (setrgbcolor) astr2str inoutputcolors
11928 /gere_pstricks_color_out {
11930 dup [fillcolor] (setrgbcolor) astr2str outputcolors
11934 /gere_pstricks_opt {
11935 % /CourbeR2 {CourbeR2+} def
11938 solidlinewidth setlinewidth
11939 solidtrunc length 0 ne {
11940 solidtrunc 0 get isstring {
11941 dup trunccoeff solidtronque
11943 dup solidtrunc trunccoeff solidtronque
11950 dualpolyedreregulier
11953 dup chanfreincoeff solidchanfreine
11955 RotX 0 ne RotY 0 ne or RotZ 0 ne or {
11956 {RotX RotY RotZ rotateOpoint3d} solidtransform
11958 CX 0 ne CY 0 ne or CZ 0 ne or {
11959 {CX CY CZ translatepoint3d} solidtransform
11961 plansection length 0 gt {
11962 0 1 plansection length 1 sub {
11964 plansection i get solidplansection
11968 /rmfaces rmfaces bubblesort reverse store
11969 0 1 rmfaces length 1 sub {
11971 dup rmfaces i get solidrmface
11973 tx@Dict /pst-transformoption known {
11974 dup {pst-transformoption} solidtransform
11976 solidaffinage length 0 ne {
11977 %% si on affine, il faut colorier avant
11978 activationgestioncouleurs {
11979 gere_pstricks_color_out
11981 solidaffinage 0 get isstring {
11983 /solidfcolor where {
11987 affinagerm solidaffine
11989 dup affinagecoeff solidaffinage
11990 /solidfcolor where {
11994 affinagerm solidaffine
11996 %% et il faut evider et coloriier l'interieur si necessaire
11999 activationgestioncouleurs {
12001 dup [fillincolor] (setrgbcolor) astr2str inputcolors
12005 /activationgestioncouleurs false def
12007 tx@Dict /plansepare known {
12008 plansepare solidplansepare
12009 tx@Dict /plansepare undef
12010 tx@Dict /solidname known {
12011 solidname (1) append cvlit exch def
12012 dup solidname (0) append cvlit exch def
12014 solidname (1) append cvx exec
12018 activationgestioncouleurs {
12019 dup solidwithinfaces {
12020 gere_pstricks_color_inout
12022 gere_pstricks_color_out
12025 solidinouthue length 0 gt {
12026 dup solidinouthue solidputinouthuecolors
12028 solidhue length 0 gt {
12029 dup solidhue solidputhuecolors
12031 solidinhue length 0 gt {
12032 dup solidinhue solidputinhuecolors
12036 tx@Dict /solidname undef
12045 activationgestioncouleurs {
12046 dup solidwithinfaces {
12047 gere_pstricks_color_inout
12049 gere_pstricks_color_out
12051 solidinouthue length 0 gt {
12052 dup solidinouthue solidputinouthuecolors
12054 solidhue length 0 gt {
12055 dup solidhue solidputhuecolors
12057 solidinhue length 0 gt {
12058 dup solidinhue solidputinhuecolors
12063 0 1 fcol length 2 idiv 1 sub {
12065 dup fcol 2 i mul get fcol 2 i mul 1 add get solidputfcolor
12067 vecteur_en_c@urs not {
12068 /lightsrc where {pop solidlightOn} if
12070 /vecteur_en_c@urs false def
12072 dup action cvx exec
12074 solidnumf length 0 ne {
12075 solidnumf 0 get isstring {
12076 dup projectionsifacevisible solidnumfaces
12078 dup solidnumf projectionsifacevisible solidnumfaces
12081 solidshow length 0 ne {
12082 solidshow 0 get isstring {
12083 dup solidshowsommets
12085 dup solidshow solidshowsommets
12088 solidnum length 0 ne {
12089 solidnum 0 get isstring {
12090 dup solidnumsommets
12092 dup solidnum solidnumsommets
12097 tx@Dict /solidname known {
12098 solidname cvlit exch bind def
12099 tx@Dict /solidname undef
12110 /pst-dodecahedron {
12122 ngrid length 1 eq {
12134 /pst-parallelepiped {
12147 ngrid length 2 eq {
12159 % r {Mode} newsphere
12161 ngrid length 2 eq {
12171 /save-cylinderhollow solidhollow def
12172 tx@Dict /function known {
12173 range aload pop function cvx {axe} h ngrid newcylindre
12174 tx@Dict /function undef
12175 /solidhollow true def
12180 ngrid length 2 eq {
12191 /solidhollow save-cylinderhollow store
12194 /pst-cylindrecreux {
12198 ngrid length 2 eq {
12209 /save-conehollow solidhollow def
12210 tx@Dict /function known {
12211 range aload pop function cvx {origin} ngrid newcone
12212 tx@Dict /function undef
12213 /solidhollow true def
12218 ngrid length 2 eq {
12230 /solidhollow save-conehollow store
12237 ngrid length 2 eq {
12250 /pst-troncconecreux {
12254 ngrid length 2 eq {
12267 ngrid length 2 eq {
12278 ngrid length 1 ge {
12289 % tableau des points de la base
12290 % h hauteur du prisme
12291 % axe : vecteur direction de l axe
12292 base decal rollparray
12294 ngrid length 1 ge {
12305 % tableau des points de la base
12306 % h hauteur du prisme
12307 % axe : vecteur direction de l axe
12310 ngrid length 1 ge {
12320 ngrid length 2 ge {
12321 [ngrid 0 get ngrid 1 get]
12323 ngrid length 1 eq {
12331 %% syntaxe : array N h u newruban -> solid d axe (O, u),
12333 % tableau des points de la base
12334 % h hauteur du prisme
12335 % axe : vecteur direction de l axe
12338 ngrid length 1 ge {
12345 %% syntaxe : r phi option newcalottesphere -> solid
12346 /pst-calottesphere {
12349 % r phi theta option newcalottesphere
12352 ngrid length 2 eq {
12358 newcalottespherecreuse
12365 %% syntaxe : r phi option newcalottesphere -> solid
12366 /pst-calottespherecreuse {
12369 % r phi theta option newcalottespherecreuse
12372 ngrid length 2 eq {
12377 newcalottespherecreuse
12381 /pointtest{2 2 2} def
12384 % tableau des points de la base
12385 % h hauteur du prisme
12386 % axe : vecteur direction de l axe
12399 ngrid length 2 ge {
12400 [ngrid 0 get ngrid 1 get]
12402 ngrid length 1 eq {
12413 /pst-polygoneregulier {
12425 /activationgestioncouleurs false def
12427 base aload pop n 1 sub {solidfuz} repeat
12442 solidlinewidth setlinewidth
12444 range aload pop function cvx [resolution] newcourbe
12447 range aload pop function r ngrid newtube
12448 gere_pstricks_opt %% r function [36 12] newtube
12452 /pst-surfaceparametree {
12454 ngrid length 2 ge {
12455 [ngrid 0 get ngrid 1 get]
12457 ngrid length 1 eq {
12461 { function cvx exec } newsurfaceparametree
12468 ngrid length 2 ge {
12469 [ngrid 0 get ngrid 1 get]
12471 ngrid length 1 eq {
12475 { function cvx exec } newsurface*
12482 /activationgestioncouleurs false def
12483 /vecteur_en_c@urs true def
12484 solidlinewidth setlinewidth
12489 tx@Dict /solidname known {
12490 texte args definition cvx exec
12491 solidname cvlit exch defpoint3d
12492 tx@Dict /solidname undef
12494 args definition cvx exec newvecteur
12497 [linecolor currentrgbcolor] ( ) astr2str (setrgbcolor) append
12505 %/pst-vect-2points {vecteur3d} def
12515 solidfilename newobjfile
12520 solidfilename newofffile
12525 solidfilename readsolidfile
12526 % /activationgestioncouleurs false def
12532 args (pst-plan-) definition append cvx exec
12535 dup base planputrange
12537 origin eqpl@n pointeqplan 0 eq {
12538 dup origin planputorigine
12540 ngrid length 0 ne {
12541 dup ngrid planputngrid
12543 tx@Dict /solidname known {
12544 solidname cvlit exch bind def
12545 tx@Dict /solidname undef
12550 /pst-plan- {pst-plan-plantype} def
12552 %x0 y0 z0 [normalvect] norm2plan
12553 /pst-plan-plantype {
12554 dup plan2eq /eqpl@n exch def
12560 args (pst-plan-) definition append cvx exec
12561 /pl@n-en-cours true def
12562 definition length 0 ne {
12565 base 0 get base 1 get lt
12566 base 2 get base 3 get lt and {
12569 [-3 3 -2 2] %pop base %aload pop boum
12572 origin eqpl@n pointeqplan 0 eq {
12573 dup origin planputorigine
12581 dup CX CY CZ planputorigine
12586 ngrid length 0 ne {
12587 dup ngrid planputngrid
12590 % dup RotX RotY RotZ rotateOplan
12593 tx@Dict /solidname known {
12594 l@pl@n solidname cvlit exch bind def
12595 /solidname solidname (_s) append store
12599 /pl@n-en-cours false def
12602 l@pl@n RotX RotY RotZ rotateOplan
12603 % l@pl@n CX CY CZ plantranslate
12604 fontsize setfontsize
12606 solidplanmarks {l@pl@n projectionsifacevisible planmarks} if
12607 solidplangrid {linecolor l@pl@n projectionsifacevisible planquadrillage} if
12608 solidshowbase {l@pl@n projectionsifacevisible planshowbase} if
12609 solidshowbase3d {l@pl@n projectionsifacevisible planshowbase3d} if
12613 /pst-plan-normalpoint {
12616 dup plan2eq /eqpl@n exch def
12619 /pst-plan-equation {
12622 dup /eqpl@n exch def
12624 2 copy pop /eqpl@n exch def
12629 /pst-plan-solidface {
12638 dup CX CY CZ planputorigine
12641 % dup plangetrange aload pop boum
12642 % dup origin planputorigine
12643 dup plan2eq /eqpl@n exch def
12647 ngrid aload pop newgeode
12653 % /activationgestioncouleurs false def
12659 fontsize setfontsize
12662 action (none) eqstring not {
12663 args definition cvx exec point3d
12665 texte args definition cvx exec pos (text3d) append cvx exec
12666 tx@Dict /solidname known {
12667 texte args definition cvx exec
12668 solidname cvlit defpoint3d
12669 tx@Dict /solidname undef
12674 %% syntaxe : alpha beta r h newpie --> solid
12677 ngrid length 2 ge {
12678 [ngrid 0 get ngrid 1 get]
12684 /pst-trigospherique {
12687 solidlinewidth setlinewidth
12690 args definition cvx exec
12695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12696 %%%% procedures pour \psProjection %%%%
12697 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12699 /gere_pstricks_proj_opt {
12700 /planprojpst where {
12702 planprojpst projectionsifacevisible projpath
12703 % /planprojpst where pop /planprojpst undef
12705 /solidprojname where {
12706 /solidprojname get noface phi
12710 xorigine isinteger not and
12711 yorigine isinteger not and
12712 yorigine isinteger not and {
12714 [xorigine yorigine zorigine] ( ) astr2str
12716 projectionsifacevisible solidprojpath
12718 xorigine yorigine zorigine [ normale ] projectionsifacevisible planprojpath
12724 solidlinewidth setlinewidth
12727 /cercle {cercle_} def
12730 gere_pstricks_proj_opt
12734 /proj-pst-courbeR2 {
12735 l@pl@n plangetrange aload pop
12736 setyrange setxrange
12738 xmin ymin l@pl@n pointplan smoveto
12739 xmin ymax l@pl@n pointplan slineto
12740 xmax ymax l@pl@n pointplan slineto
12741 xmax ymin l@pl@n pointplan slineto
12742 xmin ymin l@pl@n pointplan slineto
12743 planprojpst projpath
12745 solidlinewidth setlinewidth
12748 range aload pop { function cvx exec } CourbeR2_
12749 gere_pstricks_proj_opt
12753 l@pl@n plangetrange aload pop
12754 setyrange setxrange
12756 xmin ymin l@pl@n pointplan smoveto
12757 xmin ymax l@pl@n pointplan slineto
12758 xmax ymax l@pl@n pointplan slineto
12759 xmax ymin l@pl@n pointplan slineto
12760 xmin ymin l@pl@n pointplan slineto
12761 planprojpst projpath
12763 solidlinewidth setlinewidth
12766 range aload pop {} { function cvx exec } Courbeparam_
12767 gere_pstricks_proj_opt
12771 [proj-args] length 0 eq {
12772 xorigine yorigine /proj-args defpoint
12776 [proj-args proj-definition cvx exec]
12777 dup 0 getp projname cvlit defpoint
12779 1 getp projname (0) append cvlit defpoint
12781 /projname where pop /projname undef
12783 proj-action (none) eqstring not {
12784 solidlinewidth setlinewidth
12786 [proj-args proj-definition cvx exec] 0 getp point_
12787 gere_pstricks_proj_opt
12790 % 1 1 0 0 1 1 Diamond
12791 texte length 0 gt {
12792 proj-fontsize setfontsize
12794 solidlinewidth setlinewidth
12797 texte [proj-args proj-definition cvx exec 0 0 phi neg rotatepoint] 0 getp
12798 pos (text_) append cvx exec
12799 %% /planprojpst where {
12800 %% planprojpst dupplan dup phi rotateplan /planprojpst exch def
12802 %% xorigine yorigine
12803 %% 0 0 phi neg rotatepoint
12807 %gere_pstricks_proj_opt
12808 planprojpst dupplan dup phi rotateplan projectionsifacevisible projpath
12813 /proj-pst-vecteur {
12814 proj-action (none) eqstring not {
12815 planprojpst bprojscene
12816 solidlinewidth setlinewidth
12819 xorigine yorigine 2 copy proj-args proj-definition cvx exec addv drawvecteur
12824 proj-args proj-definition cvx exec projname cvlit defpoint
12825 /projname where pop /projname undef
12830 proj-action (none) eqstring not {
12831 l@pl@n plangetrange aload pop
12832 setyrange setxrange
12834 %% xmin ymin l@pl@n pointplan smoveto
12835 %% xmin ymax l@pl@n pointplan slineto
12836 %% xmax ymax l@pl@n pointplan slineto
12837 %% xmax ymin l@pl@n pointplan slineto
12838 %% xmin ymin l@pl@n pointplan smoveto
12839 %% planprojpst projpath
12841 planprojpst bprojscene
12842 solidlinewidth setlinewidth
12845 proj-args proj-definition cvx exec droite
12850 proj-args proj-definition cvx exec projname cvlit defdroite
12851 /projname where pop /projname undef
12855 /proj-pst-polygone {
12856 proj-action (none) eqstring not {
12857 l@pl@n plangetrange aload pop
12858 setyrange setxrange
12860 xmin ymin l@pl@n pointplan smoveto
12861 xmin ymax l@pl@n pointplan slineto
12862 xmax ymax l@pl@n pointplan slineto
12863 xmax ymin l@pl@n pointplan slineto
12864 xmin ymin l@pl@n pointplan slineto
12865 planprojpst projpath
12867 solidlinewidth setlinewidth
12870 proj-definition length 0 eq {
12875 proj-definition cvx exec polygone_
12876 planprojpst projectionsifacevisible projpath
12880 proj-definition length 0 eq {
12885 proj-definition cvx exec projname cvlit exch def
12886 /projname where pop /projname undef
12893 proj-args proj-definition cvx exec projname cvlit defcercle
12894 /projname where pop /projname undef
12896 proj-action (none) eqstring not {
12897 l@pl@n plangetrange aload pop
12898 setyrange setxrange
12900 xmin ymin l@pl@n pointplan smoveto
12901 xmin ymax l@pl@n pointplan slineto
12902 xmax ymax l@pl@n pointplan slineto
12903 xmax ymin l@pl@n pointplan slineto
12904 xmin ymin l@pl@n pointplan slineto
12905 planprojpst projpath
12907 solidlinewidth setlinewidth
12911 range aload pop proj-args
12912 proj-definition cvx exec Cercle_
12913 planprojpst projectionsifacevisible projpath
12918 proj-action (none) eqstring not {
12919 l@pl@n plangetrange aload pop
12920 setyrange setxrange
12922 xmin ymin l@pl@n pointplan smoveto
12923 xmin ymax l@pl@n pointplan slineto
12924 xmax ymax l@pl@n pointplan slineto
12925 xmax ymin l@pl@n pointplan slineto
12926 xmin ymin l@pl@n pointplan slineto
12927 planprojpst projpath
12929 planprojpst bprojscene
12930 solidlinewidth setlinewidth
12933 proj-definition length 0 eq {
12938 proj-definition cvx exec ligne
12943 proj-definition length 0 eq {
12948 proj-definition cvx exec projname cvlit exch def
12949 /projname where pop /projname undef
12953 /proj-pst-rightangle {
12954 proj-action (none) eqstring not {
12955 planprojpst bprojscene
12956 solidlinewidth setlinewidth
12959 proj-args proj-definition cvx exec angledroit
12966 proj-fontsize setfontsize
12968 solidlinewidth setlinewidth
12972 /planprojpst where {
12973 planprojpst dupplan dup phi rotateplan /planprojpst exch def
12976 0 0 phi neg rotatepoint
12980 pos (text_) append cvx exec
12981 gere_pstricks_proj_opt
12989 %%BeginProcSet: cm-super-t1.enc 0 0
12990 % This file is generated from `T1uni.map' and `glyphlist.txt', `gl-other.txt'
12992 % LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
12993 % LIGKERN quoteleft quoteleft =: quotedblleft ;
12994 % LIGKERN quoteright quoteright =: quotedblright ;
12995 % LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ;
12996 % LIGKERN greater greater =: guillemotright ;
12997 % LIGKERN f f =: ff ; f i =: fi ; f l =: fl ; ff i =: ffi ; ff l =: ffl ;
12999 % LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
13000 % LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
13001 % LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
13002 % LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
13003 % LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
13004 % LIGKERN nine {} * ; * {} nine ;
13033 /perthousandzero % PERTHOUSAND ZERO
13142 /hyphen.alt % HANGING HYPHEN
13278 /germandbls % or /germandbls.alt
13282 %%BeginProcSet: texps.pro 0 0
13284 TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
13285 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
13286 exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
13287 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
13288 pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
13289 div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
13290 /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
13291 definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
13292 sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
13293 mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
13294 exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
13295 forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
13299 %%BeginProcSet: special.pro 0 0
13301 TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
13302 /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
13303 /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
13304 /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{
13305 /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
13306 X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
13307 /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
13308 /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
13309 {userdict/md get type/dicttype eq{userdict begin md length 10 add md
13310 maxlength ge{/md md dup length 20 add dict copy def}if end md begin
13311 /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
13312 atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
13313 itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
13314 transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
13315 curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
13316 pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
13317 if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
13318 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
13319 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
13320 yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
13321 neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
13322 noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
13323 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
13324 neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
13325 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
13326 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
13327 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
13328 TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
13329 Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
13330 }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
13331 save N userdict maxlength dict begin/magscale true def normalscale
13332 currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
13333 /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
13334 psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
13335 psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
13336 TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def
13337 @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll
13338 newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto
13339 closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N
13340 /@beginspecial{SDict begin/SpecialSave save N gsave normalscale
13341 currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}
13342 N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs
13343 neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate
13344 rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse
13345 scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg
13346 lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx
13347 ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N
13348 /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{
13349 pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave
13350 restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B
13351 /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1
13352 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY
13353 moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix
13354 matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc
13355 savematrix setmatrix}N end
13358 %%BeginProcSet: color.pro 0 0
13360 TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop
13361 setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll
13362 }repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def
13363 /TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{
13364 setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{
13365 /currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch
13366 known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC
13367 /Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC
13368 /Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0
13369 setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0
13370 setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61
13371 0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC
13372 /Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0
13373 setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87
13374 0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{
13375 0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{
13376 0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC
13377 /Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0
13378 setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0
13379 setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90
13380 0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC
13381 /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0
13382 setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0
13383 0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{
13384 0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{
13385 0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC
13386 /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0
13387 setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC
13388 /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0
13389 0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1
13390 0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11
13391 0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0
13392 setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0
13393 0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC
13394 /Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0
13395 setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0
13396 0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0
13397 1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC
13398 /PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0
13399 setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{
13400 0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor}
13401 DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70
13402 setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0
13403 setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1
13404 setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end
13407 %%BeginFont: SFRM1000
13408 %!FontType1-1.0: SFRM1000 0.3
13409 %%CreationDate: Wed Sep 12 2001
13410 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
13411 % See the file COPYING (GNU General Public License) for license conditions.
13412 % Converted from METAFONT EC/TC and LH fonts:
13413 % ecrm1000, tcrm1000, larm1000, lbrm1000, lcrm1000, rxrm1000.
13415 /FontInfo 6 dict dup begin
13417 /FullName (Computer Modern Roman) def
13418 /FamilyName (Computer Modern) def
13420 /isFixedPitch false def
13421 /Weight (Medium) def
13423 /FontName /SFRM1000 def
13424 /Encoding StandardEncoding def
13427 /FontMatrix [0.001 0 0 0.001 0 0] def
13428 /FontBBox{-189 -321 1456 937}readonly def
13431 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
13432 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
13433 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
13434 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
13435 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
13436 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
13437 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
13438 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
13439 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
13440 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
13441 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1CE17ADBB75815
13442 7BF819C45DA64CEAA10062501C3B0FE0387FD5406CBDB17A69376AFED2632E2A
13443 C400D16CA3657327EBBCF7CAC55A62AC9AB3D07691C97D98ABFA2A4C85DB2345
13444 C8773110004A7812B031AB3F9B3AB9C7D0E5A2317931334466110BC5C95CE00C
13445 E1CD16242B71CCB962978DB5B8FB03BB2FED25589D10F8B3861F73DAEE17BC59
13446 B909B17D2510F640D341330CCF08ADF9E3106B0C8BB0D04D5F939FAE21AFE501
13447 4614CBFE82CAEF30ECC2B6B47B373FAB1A828AA3CDF7B59BF013442EEFE267AA
13448 AF153EE99EBE4743CA764DA09185666446630553F3D278E1953BFF08FE477C68
13449 4661A47656EC28B2039365CA017F4F1B6E9F85525565795336F7137CD6A3B915
13450 8DE385C64EDA6B73D489FB7338C23DBE575E588D42B0EE3DB6FBE29CC460BCFF
13451 2CD1B7CE1F259C7CC696E94019AD3E8183EA4A4525499ABBCB06ED61E8A86A8A
13452 7D19918F0464D56D7C7D75085EE53E1A7E6216471473E77E4901277294AE262E
13453 5A97692DB5BA38CA0076B6F4989B3FD5F350F66484E3AD84FFA53803A1F58968
13454 0866CC1AC68E6F645C27A233AAEADA7A412C7D3B5264952A58F7F7615C6A17F6
13455 471485C60607EB281BBBC65460660B90B1BBEEC0AF1A50754FD941C2E88135AE
13456 30195934CA89869D420A6BE98B492BCECE484A55E0557A2D6FA9C40313FAB7EB
13457 99FD04C2959AEE5D59A44EFA71313EF1C4F1E479C02EF08F614BBB421B54B89F
13458 3064A82E89500DA311DF77D9CAE81E58E287BE516AB15FA7F4FBA621F4F90F15
13459 DA162F56664AA594B81273331DBAA2475604BC0F2A13AC1911E23D60CE399FEB
13460 1319BF88B2396DBC7A0CDC15FAC9E0C0F0E7F1B96B0FE2C76D37BD4A38F3659E
13461 4856CB453A783846E199E049A580674100049BED20A5E825997B66CAA56436FD
13462 01E2EF83A37E21CCE83AE1102EC3A99442A63BCF80AE21F5CF2807B77EEE3879
13463 067CD0F020DA7E11834B239EC548D4B89141D8190749ED464DC06C800509497D
13464 15514BBE90E47A17CAC50BB75B7A22FB16072CEE88E0257EDACFB176757ACC94
13465 9C1BDEB937270E42A166741048A5C0F67B7D199DC3D2EC1893
13466 0000000000000000000000000000000000000000000000000000000000000000
13467 0000000000000000000000000000000000000000000000000000000000000000
13468 0000000000000000000000000000000000000000000000000000000000000000
13469 0000000000000000000000000000000000000000000000000000000000000000
13470 0000000000000000000000000000000000000000000000000000000000000000
13471 0000000000000000000000000000000000000000000000000000000000000000
13472 0000000000000000000000000000000000000000000000000000000000000000
13473 0000000000000000000000000000000000000000000000000000000000000000
13476 %%BeginFont: SFBX1440
13477 %!FontType1-1.0: SFBX1440 0.3
13478 %%CreationDate: Wed Sep 12 2001
13479 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
13480 % See the file COPYING (GNU General Public License) for license conditions.
13481 % Converted from METAFONT EC/TC and LH fonts:
13482 % ecbx1440, tcbx1440, labx1440, lbbx1440, lcbx1440, rxbx1440.
13484 /FontInfo 6 dict dup begin
13486 /FullName (Computer Modern Bold Extended) def
13487 /FamilyName (Computer Modern) def
13489 /isFixedPitch false def
13492 /FontName /SFBX1440 def
13493 /Encoding StandardEncoding def
13496 /FontMatrix [0.001 0 0 0.001 0 0] def
13497 /FontBBox{-218 -316 1652 915}readonly def
13500 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
13501 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
13502 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
13503 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
13504 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
13505 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
13506 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
13507 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
13508 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
13509 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
13510 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1D9F9948B28E5C
13511 88B31806AF1433ACB13EE555D069E50649D3C93032500DE92DCEF42B7487E4A4
13512 1ABF7F6C8F177A4CF5776AFDE02721C8B9F69A7CA769B2466EB4501A7E5683FC
13513 58FFB0982039E9154719C1C110840B2DC207902F8EE3E83464C763A03C52F60D
13514 D7194DA5888BCAFEECA5C0AC8DE6DCA956F1D0E6AABAB6E20F7B64BBC9871543
13515 D62E73F596D732C3A412E916A3EDADAC745BED5D2176C14AF05DC28DBEF5C944
13516 FDFFD52D98A35990F8D5FE21D5DCF5C9900FAFFB698C14E56B6667CF8734534D
13517 8698ABFC9B4BE68E86CC30704F0CE920EF1B2B0F3A73E6FB24B20F9702ED522D
13518 C0854E870B8B81B62B48650AA5E74D2F06FC2BB2E06DAE38B8F0D9D9664C7A10
13519 2DC9E0DA440F8F4DF1FC4532D5EAA610DE6FBA5F839B7645BE2C1B14B0684FCB
13520 2D97C7A8B8BBC478B454BFD2805DAA4324F87F4A9206931E71D5BD825F0F2220
13521 2836DFE33E7ECCCE97BC128FFC7ABF8356F948165A407C536FAD655329402D5C
13522 4F0B2B631756B1FB6CA2A9577F3700C4BDB7CD07D076306963C5927121445F9F
13523 B2A08B48360A2C32DF5CC083CF8244C847A68F1A9E84D0B64A8492B501FF9D6B
13524 0C2B1D11E547FC663E3745691C86ABBA55A9569249BCAF9FCA6C29F6E8FA877A
13525 8A8287775266A02FE509C316F3283B001FE5C89A5FA05A5BD7228BDBDBD6D140
13526 1B54E1ED68102880B10DA773F8E3BC936787F848BAC19030A1329D906157DA37
13527 8B4444C199C7A8359BAA60C6767EE6BA4CD355485B16820E7A851EA4E4C87ABE
13528 B28963109500A343D563AF22D46D885D465424003106954A8340390BFAD74BAD
13529 DEFB530839891695920917766B0C5D66E40AE25DB740CB8B825B27897B72CBA3
13530 AC1C1F757223FD86E8F2008CBE039CD4FDFA838B6B6DC28604677967B3D259D7
13531 CB6F5FAD59EABAE0BFFAA07F750E319C02486B34501D24AE4CDE4AA40568CA3F
13532 6E7E9585C0E050CC75AEF3371DCDB6F3E640ACD1466BF435E7274DEC215D4416
13533 756677B758304DAA5B9E8C0403CFE671A8BB4EFCB64BF1634E724F5EC926026D
13534 A25D51A2F8C9EA9AE6CF552A8A84E3BB231F9B2A3E48C880C85E43719D80375F
13535 3B47EC33351219D3DB3DC54EE1EE6149F64F24049F06009F37F439C19530E3C0
13536 D286CD96F40485ADFB51E5F304B9DAE508C15C022B54B6610D97C22562BB06F6
13537 8286959DCB63E0A012AB1049BD3BE5CA703C7E92E0E09BAAFB00958840354F07
13538 B8B0680931BE97472148DAA479968F05C3924C920B41AF22FB8A18B518CED1B6
13539 6B2150EFDC9282774E1B073AA37E46D93E36A72267BE5F0309533369565507AB
13540 1C2EF748F28171E1B86987F1979E12A8520DB33D95C7AD737CA33AA277CB4916
13541 20998649FD98D8B3FB555CA1653FEF4751FBBE48314F99AD07B76C5F235ABB85
13542 81CB84D2059F59C5DACD728661B3974327FE71894E30182A0D505546A7B8DF3D
13543 9BB2161ED64F70103C7633A490126CB37244E4BFF4186AD39598099B22060C51
13544 AE000C81A236E1CD12D8593FA6DC92940706707997810AB774A568FED3E4DF9C
13545 2D5213CE612958EB8A30ADBC187F5A76A7B6CB69958C63587F36249D2815CF93
13546 1828B48A787774C3932A7E0B6490FBF64851305308F7F6F0DD72851EA85DDFA8
13547 CEDBE3DD9919F1A01CBAB6C96CDBC99701486E6C7B1D3A8DA318C9BDFE316D58
13548 2C7A94DE3027FD767D6DD528EEA22D6511B0590FD6BEAF50DF131A2B4EEF04A9
13549 9639761EDD698D9759C250A3BC81FAB57808479B7B488456C2FB7BB64D2A9C29
13550 AF8A992F293724FCC05E318AA97686E8C27F8FF52EFD355D4C34FCF7169446D2
13551 9AC24141E6C7CD96E84A36BA989823E3CAF96727105A46C57EEA149A0C169E3F
13552 CCD9AE73E1A245B091707F5B73FB24648387F15D56DFAB048DBF15050B577364
13553 7BFF70650A4868EDFCE51CB15ADBDC51BC68EFAAE6CB55ABA4D286060988C251
13554 6A81623DF105FFC0DC492F5D65B758F97102E7AE06C021C15494978306B7449F
13555 059AE81AF0826C679CE44A084B470CA3360AD9989FBF7C54CA8478904EC152E3
13556 A4F818C6DE8A07294FAEA035E283D0E4B4C9307FBBCC5ADCDE0E39CB06F6F19A
13557 A2F1F87BFC2A9E0C0F647788CF1CC9BD04C4512F5214B3BA392999D09144C510
13558 9FF036FEAE14A1171BD2C15C916898BC30968ABFE5578A31823AC06055C62DFF
13559 E4D82E81DA35FE96483354EDC3E7C61816D57CA96BA38358EF44095D6C5BEC9A
13560 0A2E0ED85E7AA8FF4E920CD6CCFD9ACC174A58719DEAC5A61E85F87CC1EBD95E
13561 63DA3C27D1766B0C73701B10ACF7891ABB0F75E834F09E0010533BD1753F87D7
13562 0E8DC843FDBDFEAA1103551898282051FB5E0632A04F180EFFBEFC7FE8CF720F
13563 21CCC225A8ADFBD4B2909199F3FDDF8A406D54EE9273CAEC6EE3A558A2E0593E
13564 472B57DC7CAD3B89FECB4B28DB0C85764B70DE623EF399A112714A67EC9F8530
13565 F5AD1A77217ACA3433D0F32F8B7C6B390EAF9B71682231886B7B339629688267
13566 DD946C8A05268F147654BF2F6C294912AB113DEE87010CB717F150816985FBDF
13567 DA6D3E8DA003CBF00B53EA8AF730878A978ABEF1C432539E4C1D58481F850CCB
13568 7714367D1FA2B81AE01A8ACC72FF67FFA5F6B58508575F944970EB57107BB8FF
13569 0113FD82DE758218B82FD38C1FF2E594DD8E01FC6C65FA0F2D3A78B159C0F505
13570 BE626E6F5D17F4305D749B3659AB24DFF6BC71F1C072C404F4E2C0507A361BF7
13571 F774505C5163C35BAF0768DA860819B17F95F121B5894A362455615F94AE9AF7
13572 4B4F0070ACDF7CA979C28CAA156C45671FB5B4F0460EA634E97FAF1696A09F13
13573 0B3D7BD0EC942FDAA944F1B6EB45D58CA9C51DC93BC429B8C7AA577C30EA9E53
13574 F7461B2C08438D5EFF37C5D6080453284D318EC0FD5DDBA3269175FD5753ABF5
13575 433C5A48188ED97C5481528A53B426A832F3900E6494FFF9E4D785C7683A4299
13576 C2E9B0F4A2CDA7BBAD5C077185DC62365BC1C062358726FAF6C0C6A0354776E0
13577 5D610F7F982ABC334A276ED33A96BE15986088EDDE1CE03BC5972F05E6532BBC
13578 805FC2365E00CE5D4796F1A3C57B6E596E2A02EC3194131B54E4D3954093316F
13579 759CF19AAC8C8169AC63B5C34BE3FECFBF56C7774EC4DB40369F75FAB4DCFF52
13580 EEF5F7D16589E421FB0F7F662A6A9E410135D41EDB10155C6A7DCC13B29A702E
13581 9C34D543F6CFD18198A3B2DA975E78924AB40F0519F04EE1C20EF5B1C1F6AAD9
13582 B05156A54FD3546C06B8790959990DB0004191188036F0ABBEF31C6A0F7EDAA1
13583 0160C274C3CD492EE4DC9F3EDF13D08BFC798011E8F1CFF61783632A9025428E
13584 E579B51F8E2B1464EE07EE95C6C547175D3BA80CDDFA340C41990C4DAF52B10E
13585 C7FFFB8895A41E347F87C989B838AEE1FF2EEBA3156D44019448036DC6131C1C
13586 F4E73DCB55B4E28E0E38DB134E274851CA7BC294EC5221389115D7BF174FAAC6
13587 A113BB26B76375356A4D33105A4B75DA31652F1C04E26D4682DCD380533686E0
13588 7C8858688648B47F563B1BD32EBB4139C440B18BA92D66196CEAE2600677A4EA
13589 18CE93A465AAB4808BD6560B71BF92DE3B1ECA5D3BEA2BCDB30364D11FE025AD
13590 7C7ECAAE990D780F4102847A9845C833F932D90AD2994C7EAF39C90E9AB2531C
13591 33BFAE360B955226876AB84DABD1C005FFA6754CC6047783E14FCA7E3CCF6AF2
13592 5C1057AE07F9762A049FB5971B622655D8D3B073F306F9041319034558B08088
13593 1DF4893B17E75EA17AC2339498400B4AD1A7DBBD5469B8A5BFB7A119CF97D5F9
13594 3DC0307942FC969545915C6A9FAB3F87E64FA94B4134A71F71EF0386A643B901
13595 8FCA3F06234252E2AFAD0680837BF7F8CB17FE8956035877BC1449C1A3D74190
13596 7D5BC8B1E0A4D5D7F55D3DA106271029E3285A3768890DDD9D7C08705E89A232
13597 B2533A229759098B5DD721AF9DFAF2216B7E52495C9FCFEC70746A13928DBF94
13598 63C27326AC79D4BB6BFC1F44173F0E31B5B5628254B5FA1451E5346001B95ECA
13599 E55528267D5EBE3B65DF6F9B2DB409F26A1D1828643E8ED218666DEB7D2AA576
13600 AD47319FFCE63EA6188B133C796E447F8E3A0905F12292068127F0DACF39A519
13601 4709521FDAD74FE0505B23F243715C52271351B69F1D0F91929A1D45FBA4277D
13602 1438F6BBCD98E127CA12B0D2FDBA2F3C0CD6AB4D0F22C93A8C2E912F859AE206
13603 B2EE7E2B8C468B6249A951CD1AB6EACF03793E04ED300860A7D9C36B64CDC70B
13604 85BE89BD437F0C136C24B0E396C87D8D4C6BB505271AB557F5842899B6B8F952
13605 1BCD1156ADB74CFE6F51B34AD2E9A32B1ECC192AE7F43B3C0F19B553FFF55BB3
13606 15C6B061EF8C0457B0DF7DE7BA17CE0F8F51C1E63C253AA09B4C6439A262F4F1
13607 6448A2E37BAB25EE56CC846C6676F17CC61385772FDDF94D4B3002D9C498C3D8
13608 A48838A442E796E1104AF70B3E2FDDB5299E1916F8F80D81970750B5C1C42FC4
13609 95BEAABD17277C289C864A35F38BC1343DF8510D7672CE0C0BDF3135BA2A8E65
13610 8EE9C13C7377DA0C2D6475E33EC6BE31AF1A1F18567E551A6CBFF1CD7CD6AB83
13611 23797B2EC8FD384609C8AC12751904E473D03FA6C3182C1E8786656388145B7D
13612 75E6772AA830769E9262E9B4BF8CCA17D4C8DC390C683B6F9CC9914C344872DB
13613 FC2CA1737162F1BDD5D142D4BBFF8C194008BC51CC2D6EBA722B76839719BF3C
13614 BA3CBEF3E021148D8D5526ABD6308009DE710899BE19CE63E3A54F87017B56AE
13615 D20AD69E65CBC9AE3B6824DC956BFB9666CA339E375F331AA0B08EF537ED3263
13616 9CFA3A3C33B647F2AF59247A30E508E8B8CC621CD50860AD79D8418FA53C3885
13617 F3AB0CBAED9356E725F9D17E88141158140A88FCC5D646DCB9085FCE051B1D7D
13618 AFBF5DFF147F95578DC1859362380A8324998B80ECE40F291325A17D6A9F13E9
13619 6413271D136352159E3814C8F18132585D02990857E9092FE84C3AA5D733BF21
13620 E3F79BC18A2A75664127973AE6010DE1CE9F4CA2D99A323F46E30B6110BCA39F
13621 C49EFBEBF7863B4BDA6B02D7A33DF8ACC3DF50653049EF92008CFBF8B6638AC0
13622 DC101C452AA9DB1A674DA949322FFD0E67B1A0000BA182CAC2A40D0EE72E5C85
13623 2E8A76A4387A3112E645CB61DF3B72C904E621B5887FE3D1297A2D0511E442B3
13624 3B4990833C226F12A4EADC89E061D6E1B04A02C6EE756864C6452B64BFF5E4EE
13625 520F835168BF1DDF77BB8B71E3C20B3B56644254EC9916BB64EF2E4C6D9773D0
13626 F79287C522598853720D365275AE4499BC639FCB45ECC8E55495FB8D2FD68CF0
13627 5CA1604FBA5A8605DEC5A6772A63D781C9FFF9C07BC7B002DB51B991870A6E55
13628 001743069B6611987E070F4C57807757E955E8279541C1D1B6672FA4640F53BD
13629 DB0FC967D045AA570637152BA948E1EC4647886027D7754CEAC6FBCAF77A08AE
13630 9F93F7A015CF24E6B0F09475AF34DDD3F2C348B78C1EC35E0FA39B9C9A1D143B
13631 A01D7D099AB28A59FBBA2855BA09FD47D7B7F1A1A1047CA97DBE228B33A8432F
13632 B415168A1FF842C42EE1D31E06373CC1A239519B2B7A737262E1DCDC504B38EC
13633 1D9049E4AB223FCF9C7D4A0B7879247212B7D8316349A0C9B6B6A4CE7D9E28E4
13634 0FB271AE2C5F8D2F556F60CEF2B45B990D6345D6D1524F132A4B8311E8D4CA88
13635 7617E218EF90C974BCC28E075EDA93FAF8487F908BC74BEDA6AF0524CAFD1DE3
13636 43E46B12B76231E0DF91E46DC72501FF75D6CE49A0F3906A70E8ED74EE7E550E
13637 996CACD1C1D18C0B7AB164EE9A217E632730EFA136082DECB1DBE361EE840B6E
13638 F6245573D15D816D48FCD4CEB4F08790D164002A9E97F17B7BBD36DCEF9B7994
13639 AA043F7AB084E74453BDDC618F4A063A676691C478F07E4D73C5A839E994FB5B
13640 60865AF75FA77E93DDF43CEAE9884C4CDF432A0FA96BDDCB0E43B3872A721136
13641 D7F43073AD578970D0CE846A3E34E5F4895B52328AC1739B43113FDAC9A7A4D0
13642 4BC61E91F8C0960846D9718A9D9818B2F7F1E8F45B35D595220D94EC71E4C55A
13643 A8BC19BE2E55EAFBD3CB9A058D31539A7E4911DBF1C53BE0B858CEE26B8CD7D2
13644 2D7A3F1EC33C583E9784E90BCF386E6A93C6FCDDECC4F7856F481E25637573D3
13645 7FAAE6CDBC22878EFF50A3CEDE4428C88E769720607F87E6240C36FF9C5C4239
13646 70752BC49F8717AB334820FED5BDB2F07295B8064C335484F873CD01D09229C8
13647 0137E605F08C9D4AFD281ACEB4E5E3C17FDFE1FFD07C7AF266A26F46014A804B
13648 CAB7DBCFCDEC3844AD368A838CE265083322176390B47BCFAE2312D2AE49E1E8
13649 7614A9035E7A662715E93C525951E8D6A281B1F6B9E2B6160A4C58BFC92A307F
13650 F7FAE3068468A09527D8239BD60DAF10998D1FF250603306506C6804045C240A
13651 4CD877658B6071E12DA389A9159DAB8EE4E0E42A1E444FCCE7159E6C437AA8B2
13652 8B73D52FE00F78DD12D9E79705605F512244D32C26F9DFBB6E09768DA3ACEC87
13653 BA2C543649DA7C8ECCC81FDF9800B925765C70C16236A3FB7F200A68082FF2D8
13654 437C4E85BFB031019B867189D3E1C9FBF81A9E7FC4AA236A4450A074B1ACB91A
13655 A6882CAD777B7F3973D0C0339487A7C4B3FA0E0CD9770AE380B7E7FD8E94D964
13656 F05B37700007400C99D41B4CA325C748FC43A09C5817593D02CBCE417C486AA5
13657 4A7D53A674746186A8D7CC2C6516886DBDB97BAB801C7E4B0A1D22771DDBD57A
13658 641C66507725A698B9F3E3992EABE0A2C2BFAA67B0569BCDE178DA5BFA578E5E
13659 29F62B88C6B0C64D69055939F322A79DBCB77B03D51B7A46D69774F36C977434
13660 7D3460A45490A6B6D9CDBCCFCFFE5D7849D734ACF129915AEA5D9228249C71F6
13661 DBD0BBD0EEAE7EA17EC97639C09A316BC8C853EB92E2D50DF6FD82D4047EADE9
13662 CE3832CF7344817E7384E3E7781B581FE4EF015C74AFCE52C532750A972AB442
13663 CBDDA7913DF1C7412FAEC1045451980CD3346BA277DD764C5A29F8A7ACA13BCD
13664 BD16E2DD26C9DFE4E452713911620588A8D3D2ECC1FC05C265F810773F237095
13665 A3289153CC241ACAE4E12B031124F9E8D0EE2F7070F172B42424F893E4658C3A
13666 3A8807B6E8F4BDD80FE28C4BD453FAB90B034E40FC353EBBC7D075655C046DF3
13667 D8128ACAF3911F4679108434AB4846CF4DCD10E13CA8990DCED602210DE05180
13668 F1111D806E6A8E718F54D08C8EA3C6057521811DBB57D9D3424A03ACAD85A8D7
13669 039EB206F025EE75EF233DF7189498B80F70788B50E52B7E153C354CF0640AE8
13670 C5A846C7C45FC5E31952D55B0D55144B86CC36DFD25686D44CA34B00B0F3D3B5
13671 913DB822E16F834BEF7CD5C08E42C27849EC2F034DFF52100E4C7445B7C08389
13672 F87BFFC5F91247BA7417F3742AEBFCD0C916034DCD4BBE0FE99B75CEE8D7EFFC
13673 D4773A0B01F272A81E85ABB0E1C3A8343EB64411F85A20A0D4CC2D8E18570098
13674 932B9F66FA1DEFED999020B01CC2CA8DEAE07099B1606A76C7FBFE7107729112
13675 5049B4039BF602CA8FD592CD44E860674F85E625D57D1775AACE59AB5B3801A7
13676 939F0F3909DFE1D281F65284C2D87760696BC95FCE34EB654A1E6E6282409A0A
13677 1053517F3348B96A6984E73C21F2C83072DFA155400F8D5413152DB08FB51496
13678 DB05B5E5A3F025610676C03EB1B58E4D469121E1B2BC67DCFC7AF9C3A198FF57
13679 39C688565F881B786322F63AD2D062C59ED0A4DEB10E74A09791A68E9FA393A3
13680 5D8AA214568285937A76DE9A0723C30599B2DEE1513712723813DE4FDD08BED5
13681 47005615DD2030345C776E2E75BB0F9B36DEA2BCE9E7790879F326D6C39EF865
13682 2435D8317B77DCB64BFA212B6607CC677DC2C82D88B0BF013D77F7013FC43746
13683 043B266F6B1C389EF0677D132B0A93CD1A148B9E6F4CE18673A6BC4488AEDF85
13684 3C4B6AE0029F09D6F82000FFCA75D118730F00ED8EFA4F481B0BC8F791FC30A0
13685 61C0E7E6890CC2948DC96CED6B1516EEB7D679849CA4A8C0ECE1688BBCADEDD6
13686 F560F346878A05258D3EED44A41A2D1E5443F53141A330A479B4BABD13F4515A
13687 4A8B723AF8538AAB6D10C59D056487DF1F82712BBA736A67F0E048BE695E4CBD
13688 4CEED44D1FB6D4037D7E1DF8F63804DC59968222734EBA59B9B7EF93985E49ED
13689 C967EE5FD8F1A5C2B55123E0117E77C1674DFFE102DB0A439421853DFD859749
13690 31C0D5F51FC08F5F95BCD748DB49830EAAF8525A509CFA480FF4A19FD6438C0C
13691 01F608F426873ADBF80D28F750FC12AFE27409C51837EE7A57BB4EA337648AD5
13692 35B2C190F082C8F72E8E9B29812BC67B634876AA058CB02230FE2A34E2F8C211
13693 120D73AE961F43012431411F730D1326D07A24B8FCDF5B10C7D3E55F65BF2D71
13694 E75209EF7FBCEC8D79FB20200C8B457E666C690646081A703591700BAE2F3534
13695 E6F4D0C20074C1B3F93A4C15EC0DE9AA9AFF1B3390D04FD948D117449B0ED385
13696 2DB081B42B375704BC403306D6F3462574F4AEEC80FD0CEB871078D572049798
13697 A7440207EE7973A36D3113A561ED016BBA0EDF9A18208E20664DB8CDD1211CD9
13698 F225AE1908F8610E903EC7A3BF6B0D57B0CFB392D2CD31532C6051C4B1D0848F
13699 677787C9DD5B1A5F8455515B7D6252F69D5CDDCAB9048F39400C7984A92AB9F7
13700 5DBC22BF0BB27A17C510E934D1A22ACA954BF5989851CA0782E78357F3B81E06
13701 8EB2761DDA2965A74244E5BF4959A1CC7B1B138F87FAA821247708EC21F9DDFE
13702 23EB1450BBA7232E63FFC8CE02E709CE5DEB8FF37C29C45E11D378BFCAB71FA0
13703 DAD8C5A75A6E36897BF397A293C02937B24DE2E5B2B9DAE5CE4511A471E174D0
13704 3557BF9B5DAEA7A7CA16C70BC378B5907B740AD2521CCAE39D3EB8287CC5092B
13705 AAB0834A5E59D08ED8824270866244094D1FA853632B1EF75C093AA734B26AB8
13706 10A0895DF75860BEB8BA902ABC948F73E912D0DC8CFFB7C2AD347D516A08D014
13707 5C825C78C9C864E2285B062955D94C89334C195A50ADCBBD41F6D81B3706DEA9
13708 C0ABA972DE6D609086E38A3893E1ECCC91181ADFAE54FC8B20BEF3C56902CC60
13709 1C2603C0C0886BA59CAF894294FE72A58A591D2263412392E1CC7C2EE420069D
13710 A2E012EC7C8DFBE7664BCF70081DDE4B4FE239CF773C49650FF62F9D96182649
13711 35FA6F9E72C238B7A48CACB4AC69B3DBCB36ED3F3EE9F48188286CB50AEE3437
13712 1A6314F052EC3919FB92DBE1EDF020EE0463626BE1DF94C9D23A93C9B918E4B8
13713 08DAFFA3261E252F8D170CB3017900EB4719340F8045CC52F279FEEA987A7C6F
13714 BF423892110B17487ECCD3585CF0F3E3B38E41D00558297AC290301225438C75
13715 B698DB9E6748C026C62C79287E82D34E3EF8C7EA2FA6C18872F82A9F40736746
13716 671DBEF3A4DA04A63EAD5E4FF6202FBD0042274B94BEAF0EB7F7CB36A0AE17F2
13717 BAEFDEC94F94B89E6D7BDC416FA11EE8BBB5B553846E2930CFC34EF650805200
13718 F62DA6826D46F90924B9FD409BF8FDC15082163FA6F752E74561656CD379AE6A
13719 35CA7EF4D761DFC781B13E77341630A98BD7D5E6D4C266BCF0E9FE0B0DAE30C8
13720 F2517246A1193E4F6F79AED993627B44BF73BBA5CC344376A529A388E4A864AC
13721 9AF8DEF756A9395F60478C26F5237044496B35D2311F183D4F571874B6264855
13722 3A7A28D60AADEAAAC234FF56D5A4D9F7A738766E7AB8B77FFA404E685B3C2196
13723 C827C61087200B45E53C4BB7DC831AEDCB65F8D40C7437A37D66BC018EB404B8
13724 7FA7241CFF200230AA7F3DF61AB8F22FC1280477B76050B0774A73C74D071123
13725 13621E519CF9549B3B5C4362DF0EE41B4D100FBF6D005EA0771D9026AF8F76AF
13726 A0DA33D0537CB08A09704D471A25F4F4BBB7CDC03109291BB73DEA2B8A914A15
13727 9533F0A776551EFDAF45F42DE4DDF0A80D004DA8D3E5DB224844AFF9AA7F739D
13728 48C8654C33769D75BF471FE3136A12023E54E834D2F522D531A104A218DA7B66
13729 FC122C88524893A3C7A3E8BD68F7A2C3061E544A89AEBA37A80A5A319C5FE61A
13730 64BF5FB1E9C2E439CC79BD87AD0EF0BF1DFACDE5D9FA248C3AD90CB4C3B35D8B
13731 D6C09F29CA205F9395CED7A72ECD14DF78AEA2029393F7A26FD7E028EB1A8F09
13732 11C952FE14918CD777691F1D78ACBEED666754D675F277615DE69FC6FE942452
13733 05C6E3198DF82D4F2E8AAE0AD0B9319AA1B972F0678BF43D83CD0D332EE94A90
13734 590C965E216C18318591C1929F1898DECB8205D79FDE84DD1B2405945774D118
13735 730F00ED8EFA4F481B0BC8F796E54BB5BE4E3F4C41AB42FB8020E9575401E87C
13736 A056E0F3B165FC1FB7AE7B507C0A245694AAE9B351E7DCBC970B04A385C87363
13737 E3EAC5160C866E46A7ABA1AF69B6DAEFDEC77E906AF096D6CD69A93435D64A98
13738 1A4F8D649C40A4E7239AA63931DE3B661F238BCF6CED850E58A6D1A6600EB836
13739 CC297709727629C1A74CA59FB97E706A248CC5D213BCB89E89F976CD60B01F7C
13740 A8C93F24F05DDEBFD6680783C726338A6CCFD0D1D2BFF16EE000E31FB0A3AA1F
13741 89AADEEF2A3EACD52109B4D001303443F2B9496B3ABE516B72E82AEFCCF26535
13742 D7CCFD61B369B9662627DADA0582729DAA880A7260B4F93318BDD448F1022618
13743 32EE3BE3F2EF44053D9B7185936FC36E2B3BB2438B0C0DEF66C9DF8236FC490F
13744 B80689255E7377E4E905FAE20C8CB226F1BA92FBED7BE7F3C2854E7D0752BFB6
13745 F97DFDA4187F4D9833244E58E9C9F9A5A8809459413EE8B7A76D20FCA70C570F
13746 37FEED177D438C06CEF7729364C0C3F6F96B20FC6947C2355AEDCFEAAF1B36A4
13747 B19F803785CB88EDDEFE9325ABD67DC4EDFE7D803CBCDE4D3D4B9080E3758D0D
13748 54DD13425781550C965B26A1EE18D72B236459B55B0365B011F5125CBD712ED3
13749 53353642782A51E5AEE39F81D81DC6FDB18A8F43B31E330BE53A5AF8F6D0F3BA
13750 8FBF629E7690D9613AA33E878F02E0EA8422B6F9EB064FA545841C4FDCD5C436
13751 0F156D1AA5B5E2E9BCCA216C1ED94C017BB7990AD4D1D042030FFD1FEABC1AB0
13752 26BB915C39779C6CEF53243684692CA63FD6A320D9CA98EA3330040298C4B93C
13753 B5C94E0268AE5625009EA6A0840A41792C004DBE17CE07E3786A647368AB4567
13754 102171C56B0DE32021438A2A99AF870E01034F399AF2E10D3A116396E2A7FE57
13755 C6C6372BB90A149DF5C4A435A1E6464D99B188E344FF6D43B436EF546B2218A3
13756 5BCD872F62FBBF2A6D2BBF82BC3ADE72D65B0B04689D9BE6CB9B0E8A0788155F
13757 6D9B8AE4F8035DBD9CFABADE0A4A03BF0799BDAA3C05293EDDDF036754AFDDDB
13758 25F39494094E3C158AC55E2A11DB3B0DB3F37344713A0873AEE6CB26DFACE554
13759 BA0AE1F33EC8821B552DEC6951619682E36AC1F1000681912B15DFC0926F8802
13760 E58D1A5A6247F6C48155A43A6AB0305679730FEE69C725B9FD9BCCE9E587DD16
13761 5974A8C4575606886D3AD63FF62834BFF03E80635848162D2C07BC086908E6C2
13762 4404C8A5DD929D61008EA274290FCB5D12E1BCB816EB688178606A6DEC9D5D63
13763 0116A2E89114144D994944BF936734B1F2D5B753BCA274FE59C7B529D57F922B
13764 7F2D8EB5D8AE904DA4FB1E687C00BB2C95BA01BE4561449B9C69F5C4AC362DF5
13765 96C4924FDC9B98B2F9A70239B27CB181CD17E1B1862D1702D8487D1FCE9273FF
13766 D52AB0F444B6557192914C7FE33FCA60ACA21C30FEEE1C0F22DD743D6FAE1F39
13767 8A679DC16F88AA2A1814118364281A3F2F5EB3C9B3AB66824070A8C2C84D0F19
13768 3B9EC6281282DF8FE445C59D2EEF5D96847689463904DE56B69F7ECB8E30CA50
13769 C213B4A7CC3D7D003BEEE7E9407A97A3C0EB1FC9DF0D8BDAF40A7882A0F28729
13770 4DDC576A4E406E0E12B8ECDAEA4A38FD51430D2AA6470C45985132A8373387D9
13771 52684AD45A3F75B3BD15F1E3287B918C8820FDF5E6C49E2B8699142D423DEA65
13772 2C099592C67F350AD5F1FBDF6C9DF894558B12808465210F6E4D0DB7823FC764
13773 032E59850C67DB709734C306B67E7401F68A8CC611DEC2E110825FD2443A3F50
13774 8A7B4A271C5FFAC26C08C70A1E9A6173D0D9B5CD88554B5CD108E71A49E0A37A
13775 C236C00CC476D72769B68D4DA2D0613E7C7E523538BB400905DAF677FF51DC26
13776 41D68D279BF62406BCFA1831B0859F7D44E60F35ABA9BBCA8E2B5EE8308209BC
13777 CD6435E8339AD98A7DE8FE76B658EC31B7D35CA64A51A4CC574A933A0AF70FB5
13778 F19F6113C4E0AB7098605D3A370832C9806BD7CB14F4C09A11BFB371294CE059
13779 4A8719D23BFF7225D2B254001652B1E470447552362C28EFD2DD02023D97B88D
13780 EE33B7B77C3EB974008E80E985D6D8F8B2F7FA6126E9A652F69C772CE34B037E
13781 481A5DC9ADC9255C2B1A742C2121FB00F03FB99A0EB3322C7909430D55957F4E
13782 0B4D4E3A887BBE081106935C0576DED542D996CA9AB64430CBC91819142E0826
13783 4F74F7E7BA726EC2936EE577D9BB5AD76F40BDC5789725AC69482A84EDC819B5
13784 829D5008C587DCB924E7E0051158F3FEACC7A4DC3CCECA20643DFB03B3634DCE
13785 1FD1379E05B9CFCB4AF6B0638307C1109BEA7F8BB1F068D5EC574135EF9CFBDB
13786 CD826BEF078700947E6004A924BD9C148DDE1B4446D881D0E11D6BED1B246030
13787 85A2971F80F7710C80F12FB6807A61CD5EB72ECAE813A15F0F4A1BA5E1DDED63
13788 E91A7C28ED6B634E0926B7F022222904B4750795E98BCAA1429F8ED2E2893982
13789 18A5683F33237A0427200E0F67C1446CADD4B2B0C9DEF20C9E3178A1BA4E7E43
13790 3C4836D6BB0E8377819E53521E0140DC768088CD8EE74E210A589C90C50BA3DB
13791 C2E0479C61B426F3E8F6FA4F78ABAD70774873E03B2552E227485C22C1D09684
13792 215ED3A54E36D5462C6742D01675DAE7DD35C28BAC9F447842585F0CBB0ADE49
13793 3CBF3CF15E3ED08331CEA12BEFE6BACD9F8A0339F223F7478181D6921C6F3186
13794 AB9CF291CF91CA1A3DC9823A9B93F07A273C44AA30159C47D3938BB417A2E8A2
13795 E1A2E0DF86EB9B0E3319CE01C7978345E4C4F96D95567DBFE86805BDB38332FD
13796 F9E5E07FACE75CFAB6C80FAE5E137508EE8A820060A5243710F5173EAAE55A8E
13797 99E893225EEDF5E186E57C8ED33F49F37A8ABC0783CDD93EE44D18858BB00DC8
13798 014BFBEE6A190327C2C4C12C5A4EB5F82200B873BAB1FD4EA1EF3D451D9A2E12
13799 30760FAE16A21F5792221703F15B1661885A43791573FCE20C7F2DB37C4BD225
13800 1B3BB4DCA831CF9340B441C08BE25D998D6954A2EA90A66DF8D5A72C20A6C9D1
13801 7F8A2D81B118938F19355DF0318E4877CA5DD726BDCC7CD4AEED372ED063D2DB
13802 2C6F80F48B380CD8975326C92171C18500DFB05579350AFD3072ABA288162AA4
13803 F0B41F854A3EB12936A9729930D611E605C365ACFDA021ED042A09BFBF7100EF
13804 9CDB3CF249922AC88C4CC0D892FEC2F8BDB5CBB2C0B8ED3721EFBF7A3CBF241D
13805 08FB7D1CB8F8123DF84EF2CAB434A83ED1494634314619059DA2E96EA19F35F2
13806 2C56F04EA92DFD2D2A1E0F0D07FAA78F3D4FBD946557666BBECBE89B54D2D99D
13807 B91E3D91CB4CE9335D0E38C7D56E228CA1116CAA20EE51D8585BBEAC69EABED6
13808 6A56F327EF37BB703542EC3F8FDA956724850E5EA9D11EC13908E652BE15A52F
13809 B019328E16A8A3B9CEEC69988D90562B4CF320AA09D44FAED8EF21A637957B4F
13810 A1AEC8898DEB2A4327F4CFC98E49FE140D52502EF5947A3CA785267018A9ADCD
13811 C25394CAC880AA7B2D592A7FBCE81CE1845800BE26F849C9BE5102C1F838F807
13812 55DDBB81420FF914099CDE0C7BC610224B501293975099899A7D53779F95C0BC
13813 DB911E4129AA225A9A0760CAA2DED183818A1769E9C48F19ED301064EE303BB1
13814 5647280A3DC6DD13B140F3008B872E898AE20B2B04B881A84D7CE05CB37BBC63
13815 E870C5597A8D1C87836E0E8F34562275B0040334D0164C8846C7F1876CDF26C5
13816 E90246229155D1E54B4AC356EFE2B3381B4989BC5B8FE47B7B54E28F556704F0
13817 5F2CC6EA252C1D3F49915212351EC110DC2515A90FCD39DD64B4C719875566C2
13818 13D306A1FA2903CC74288D1513CF1F1C2D4A21E9E1CD017CAF69622CDBACE18A
13819 5E16A1544782258BD3DFD3FBA287225EE895D5F877753F7646A97EB66ADF787C
13820 42E69F8A053A36AAE750394D00A2A86DA348F57BE80585EB1E757A219410D43F
13821 4373E74A1BDFAFF740E2A6661427F87735E06D444FAA1121A3C0E8E7468A0C74
13822 45DE24FD098DC4A670329F41B5F855B56DB76AD7E690F64C5F888919F747DD40
13823 53F6906F960396464D79EC4FF5941763DCD66B5FA57203B1137C06413B59B9C7
13824 2B109B04F7CF71397C23D5DC90260D2533BF3BEE60D65BDCECFE68C2FDED71E5
13825 6D82A07C5474C48503435A958FDB8ABBDD6CFBF89570412C6CC6DFA02C832CD4
13826 B984FC8B654B1751972D1A4FCB38C477B2F6F431E027A0610C0F97EF914A79B3
13827 535AA5214C0832AC27C79598419A87D1B2F55D2E04F029712EDB11E593EEB625
13828 E3547273E6FA998308973F5B41E47849B1F3E3BF36AD7A80A764CD384E0786A7
13829 E12F577B81911BA38E0530C54272243B12A68D7914ADB76EA497A64836512F42
13830 0498A9DD85DC7CA9176521DF1A643AE38221913655367AE84D8D807361DF9F0C
13831 468D4FEBA460D86F36577923452F1EA0A0A33D4F3D3310889B133684ED83A0E6
13832 A66E3AA1EF719A7CF85BF8689227E34B13E144CA299DC1915A9AD4FBEA674C9E
13833 6E847883D59A8D07DA9FD5A2433428969FB9E444ABA2F288450DC8F678B04D1C
13834 B189C9116DC7FC833B1D3F7603CA436D5E963CBBBF5A901B90DA59F8C852E9DB
13835 52B290B61938ED2502DA0FC812E0EBB7055161ABE7D037CB299113D8DC7E40CB
13836 C0D33B13C5C4643025B2FC0BD3732F2F60194C9A8A41630EEF7CE1D3D91107F0
13837 1B042EE419C6F6061417C39AD8095BB7BB2512C91DB5BD8B64D4EEDF1EE33461
13838 4328339AE484CB0535A5D3C935903948D7B5B7C84087F960A2F0C9D51E0B1A35
13839 808B18C7C555BBC6DE9F4BF9F57297A0432BDF24E4E46391C9B154461A154227
13840 8E3FAC57DE15325013B2C0CC1FAAEAAB69B4EA97BAD25B9724868CA307CB0173
13841 92592DA704653EC9545650AAD7E9B8E046360A28ECBAF6A6AAF4D569E6860E51
13842 6CC0DCCDE6EA89C7143F84A46FD8EE2C700C9501F4C7B98643F8F018E8800ABF
13843 6FCEC63751BD3651BCDE85F4C0ADC2904A2DEAD22B23ED42C3F403AE6F68C14C
13844 974E5E5AB812B53410DFB7A7D1B07C05F923714CF9D5EB0D2C994C9E71BEE9D3
13845 88348E00177A91D9817F0F2F2BDDD0594AC981440E2FFD9940620AF7E1C70CE3
13846 625DB4B1C628DBE068424D674F46BEA8D0026E9D049C402E34445F1577386DD3
13847 019C87F8751BCE093BCC18B9B77E4C19862714101F96B1002197A3E9934C9A6E
13848 FAE94AB6E9C9F3A6D024FB156417F156DCD9B7830102BAE3ADE6D2087D915C73
13849 DFB2D7C90A4D4607491D20581DADEC675A43AFD045924C87AAB139D8F09F558B
13850 BCAB143CDCB218779912B5067435C891F151618B3573BE60B3B85F96666B4DBD
13851 3C5F423580908E8B241C869B41C83B5D6F0C562933F0CBA3AFE80EA9F9678A3E
13852 B70BB0309C179EDC60B25A105A28ACB6C94E1E8D67946D52EBADEE304983794F
13853 FE2A5387BE3BFAC737F71CAE6BF3313CBDF6E7FD0B3E2DCBD6DD1753B816E7FE
13854 F3D89235AD94F6D8DC203E8BD0B9807BFABA9BD94A0684F7F0635FBBF03E5EBB
13855 A3F0B5124655738EEB51376448EB28CD1AFB5D4A699A16B8841D0EBF67CF9A3D
13856 93B64F19FD9DC12BB7A7826C27A7A945818F26AE4857093B4A9ECF642D9723E2
13857 4AAAECB2C0E31BED1952766BA96FCDEAF77071CD3B5AFF157947FCDFABFCF5BA
13858 3296CF9752D8021ADCCC859A5B5AD852BA9799FEA14C7C6B4CF3567AE39A62A6
13859 C165E6C85A686FAD9B9D5BA46AB696D2050405A559AB40C08808389F8487EE8B
13860 78A771B91E069CF48F79956735F95427764CF506B306B5D687B00909A637A1C9
13861 9528050136FD834670EF530F74B49EEFA6C731C5C81E95D97DADAF9F496A9269
13862 462EF34ADFD614FB22B0165C4224DE41AED6ABB8306231E2B51DC9B5501A0D89
13863 07977FCDC41D1327AA9CFB2DAA86FEE38BC0C43709349F0CA0FAAE3A4C009C10
13864 7C735A4FA0CD1C955CA45F8DC464F5B557221F2C0383713526D2B3C251C138A0
13865 F1C7D6FC83123B48554BC6EFF84E02CD58BC77A18E530E46576A8C7965B88FC8
13866 34ED316B161C1D2147582A3EAAF72D2F07A44BFB121A7E8858330034C8A601AC
13867 A36F4D150BC8D75ADD4F5BD084D28A32E822D17B9CB167ED74FFE47911DD5582
13868 2FD5A2F50C9824E7EBDB196195C7A1CFB30702093A159F6C66239139E1A28EDE
13869 49A143AA1E63FA5873C9F0C5B2DC09D19AF6A4740EACDEA3ED12B533847F5033
13870 60B077B5D0E72B5CF6DEBE74DBF5590C5165656FEBC33FE179B745811AF3C38B
13871 B610181B5B2E2294BF077F1B9EFD95F5B53B49329EAA56F0EF2CE99B1DB1A857
13872 62C8D510B8B474CF57B6C9DA6E28AEF743ABD33838B4F78AC3C6D35ABDBCC39D
13873 2D0CB8DD52324189934735581972A6C586B9F7959B560609166FB3C9F57866EF
13874 12FE891C4154E99311D7B37EF8D7874C47ECF9E0C30C43D27BA46A36EFF32E2D
13875 54E63AEC937F3E3E0A8CBFE83C9761DE5EA9026C27C3DCD293F69C2B7DCF3720
13876 6497C5636673FCDFF6605FFD468F2373CC205E75E0A961D6943E493D52AA6ED9
13877 783E8EFB52C34F7CDC2E197DBE82D2A4CF584016480009105E6DBB61BD849C34
13878 1015194C7C71E6F1121FE577A35205F6CC25A029FA329354F022B7CC4D92AB1D
13879 A4514D68587CD8F6EA074D8A2A3B38EB8103C40DF57E8A5E089644162A6C9DC5
13880 00686CEF0D553BA997A7DDFC1853D703C442EBDC49320D0520E96D180503E107
13881 ED9B58D287A94CF6D5899933BEE9498C395E54A737CEC3753B811196E9E59298
13882 F9B5F91BCDA04FD5FA368B2A3146B966CF0E92E86855ED95E333BB3C108F8D8F
13884 0000000000000000000000000000000000000000000000000000000000000000
13885 0000000000000000000000000000000000000000000000000000000000000000
13886 0000000000000000000000000000000000000000000000000000000000000000
13887 0000000000000000000000000000000000000000000000000000000000000000
13888 0000000000000000000000000000000000000000000000000000000000000000
13889 0000000000000000000000000000000000000000000000000000000000000000
13890 0000000000000000000000000000000000000000000000000000000000000000
13891 0000000000000000000000000000000000000000000000000000000000000000
13894 %%BeginFont: SFRM1200
13895 %!FontType1-1.0: SFRM1200 0.3
13896 %%CreationDate: Wed Sep 12 2001
13897 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
13898 % See the file COPYING (GNU General Public License) for license conditions.
13899 % Converted from METAFONT EC/TC and LH fonts:
13900 % ecrm1200, tcrm1200, larm1200, lbrm1200, lcrm1200, rxrm1200.
13902 /FontInfo 6 dict dup begin
13904 /FullName (Computer Modern Roman) def
13905 /FamilyName (Computer Modern) def
13907 /isFixedPitch false def
13908 /Weight (Medium) def
13910 /FontName /SFRM1200 def
13911 /Encoding StandardEncoding def
13914 /FontMatrix [0.001 0 0 0.001 0 0] def
13915 /FontBBox{-185 -320 1420 942}readonly def
13918 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
13919 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
13920 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
13921 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
13922 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
13923 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
13924 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
13925 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
13926 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
13927 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
13928 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1CE17404B38C64
13929 2D990978CE255A54BFDCACFC8C47EC23234DE3BF30D80FC7554B3C8250010820
13930 CD396B43FBABD7A9C859B8A7E02A84AA32830987A502ECE9EBA01148EF0DD04F
13931 5E56C41647C1ACA4A5AAE50E8CF4877A87CD3C6CBC5E3D24B980864C67DA47B3
13932 A6E25BBFB6357E5BE16DD588A83E9B747303C1B50EE43637C741453A2359A917
13933 6E1BBB8549974FAA7B611B0FCC51EFC4F36A2DE53CBC9902BEF0DAA0F78067CC
13934 8CA5BD5BAD2FAE8231A2D4F53758AFA15F2E941138286D7A1B37982E457C4C2D
13935 E9C59C235A966FC802E74B6ACD601E5C70DF1A3A2C6A83ECA08C8F17D44EC82E
13936 A4A90A341504BD6A0E1B9F275C71228E3E61FAB609E5DC1F838885D10E052BB7
13937 94871776DA0DD6A2516D90EE7C62D1ED0BF44D79C278B41B40D79A294C95B273
13938 05BDCDE0AB2BF38816ED24B20E0A30BECCA0318828289E8B589A7E27DBFBE8C4
13939 6C8BA72ED4E2744ACF9F548D5D141D825F45C118FFDB6647AD3249036DE1A722
13940 A072D7433EF36C4D4F92D4FCF6767209C3DD2C4E988752A898BA472BA799BBE6
13941 44D3CEC78F0CDD45C31064B0D852B1618DDF827CEA2108B29B09222E96E6A273
13942 8D2A61D15E915E685ED114909B51B46F37163C32026246065D3E0B31620E25A0
13943 732B4308946270EFD297FF21A804AE3DA845EA4D5C70AF87E3AAB6169DF62175
13944 76D9871D190D5993DE256BB7B4ED36340CD545E79DC4797601B3B3C4394E9E2B
13945 6649661FB940989092B9DD89DCD335460B37921311F8BA3DA967ECF13C485F2C
13946 C8E86EF8B6C95F1BA7E3807A3C1D4AF146E6642DD086FA5B30D19D00E1A8BEDF
13947 7FAE632A09287BAF10879CB2F4334A5F8ADA3242140573F0379E1A96FAF6E8D4
13948 EA877B0E33989A8982548FC0437850C4A820C8709ADA1B9870F628B507DB1A1A
13949 704B01EF5A26E0319414B3F53A1C2CDA74DB0C401D15D1E664802F9C12262830
13950 1B463A5FCA7623B31715A8ED1CADB828028E26316CA2782005BF9D1D30C729BB
13951 618F6EA9AA4A31660EE294C4EFFEF9696162D5E7E67CAC6C6F867029E369B301
13952 795BDB2F3C0A53E24BCE1BAD2474756157053F82BA4BF3E8E4F7D19AE1206263
13953 3A852FDA96911B7294A827B018CF4E73FE10D63BECB0E9622ED06DB275A78BF3
13954 A39487DAE5C2154F81C8476220ED014A091DC95003223748B495A807D2AF179E
13955 82B79A40CCA5F62A9C56C5363623C7BF20C853AAB2A57DCEA9747723965BBFF9
13956 ADFBA701CBA0914FF8C156E2186F7B035F7E7ED63841BFC0A856F1263C8BB499
13957 753DEAE0D7BBCC4B1331F83699F9C3B6B13972441EF39E3E7E2953726CF2FF4D
13958 B50714EF195DF67D4CA3553DA6E3FA3B012398F4F7DBCF665C0B85EE554DE1FF
13959 A0ACDE9C1E65599B46B798E7B3A97AF495A7F2B6D7BB633ECC7E501829D28A7E
13960 2F2BFB0E747B9361F48F2A18CA77C0580F75B3BB678CBFD9976419841614B61A
13961 4A3DA50B1819A98BA0D11BFCB34FD0EB54324910056E67300AA518B35FFCA2BF
13962 9A151AF53ECE2A982CDDFEFE03D751F0A495337C5EFDFB9C854A31D188DAC792
13963 75EFE8216B2E91864909E4FC39EA7D93D0487E7D3AF6AC561EE22F2E678E6568
13964 5700673FF46320A138B7618189862A57A4B3B951BF89C82B078FF2827E2168A4
13965 B89535FBC8617C235562BB04E89C31A0167D93B54050BFA999B0E70740AC408B
13966 B9B61C2E8B9A24493C068F9A76395AAF48909C357E5DFDF0C13913A4462C63A0
13967 B6D795D0999506137E1CC4EA546414214267A09E921C85C242046F24AF4A5C4C
13968 B2B3CDA3B98FDF7BA2604D713C720DE6D3B23B3A7716339C45BB9F4143A25258
13969 88557F6E9ABF61B74965FE6593DE3A3B943697CC082920E4FB4699D84E009259
13970 F0DB23AADBE8ECA9501277F1CFA52143A3166E8F2AD737297D3BF885B5E6E235
13971 A58C64D8D0662B8F434A80AABB482532E9F0DFAB603A101F02000BF3635EDF1A
13972 3287C67E647F265A37620A6130031EED670768E3E04665B4EC4566EAB6B59FFE
13973 3798118FFB29A5B0927390D4E02B729D3A3B7C2A1260D75182C6DC98EEC32C7A
13974 D1C1209B9E66991F131514E8A76F9D5C431046A5C199EE9D910761E85C03DF77
13975 C1FB2E4C737EB40E697882E3E930BEFF452E0FA39E43397910B03B4FD68DA8D6
13976 B748BA55E4B1A46A7195F8F769B5CD39EFDA3B5FB9B2BA42E00ADB04BC1B298F
13977 EB5231DAADB87ACE62A6D3CE931B60115E3D30511624269F7600A300B8CF4ACD
13978 3844B6984FAF61FE14F4133F43F7625336580D12F04EEE67B5C1CE6E9161790F
13979 0F9176DFC6B634B930ADD720CF96E4D87576A6CAFCC8ED24BB0D41575C11BDE8
13980 1F9E6A2908A9BA7C4CCC2D0757B047D81075F02A94D59AEC3300BF059FC37FDD
13981 A42F8DDB80A47A6374D4FB01E6220B0016AE277DE63AC5BADF7C8C858F98FA55
13982 8639BF41F9205329B885DD61EDA0BF5C0EA32B89ADFF4E0BD4CB6BA8A2CC0881
13983 11A07B26EAE83DF4DD45E5B15CA078787DB9A2983764B848EB5F4D4076A37EB8
13984 58CA5666D2C1D17FD4D9B26D7099516940AAC6154D05EC73F8C024DDEDD6D7DF
13985 3B5DD41D6180AF94D6E0242A3329AABBCB57A96331BFE725CDA793F6108842C0
13986 2A3F2651F70008BBDF7BA9BB7E1E8B28B0B20AB88D4496C0F30A79BD56905DEE
13987 B2CA5387FA69F268D68578CFB30DDED984C2FBFB9EF2E73CC880592C2A0DAB50
13988 9732970C05BAC6FC723C732933783D54D6957A725EF7FBEFFE928BF1F7DE2072
13989 ADAF53BB0318446968E4DF9EA51078393906217A5F7D0A0CD8342D738E0B6BFC
13990 8969DA99215CEF239E6AF739C34A694FC67C6D401A3A8D355D4535F322C3401A
13991 04093C37D119B7709AAA194B50FE71C61100C985C1D706AFDA7D25E6266F3002
13992 AA8660868049AFD2C03299F76DECADA8BD9CE057CC271657BE86291FE59FD806
13993 895A197CA5415D1C2836D30E27ECD766EE1E9B2C0A60685070D6D5F61D5B0ECE
13994 F799D976FD5AF41A8DB91E6144CF9F3B99EFD8BD10DADBA506F4B9E48A19F5E9
13995 D0567DBB96BC6EFDB8E0D0CBFB6DB78AF3D7B7B948A1C226881E67FAEC8A131D
13996 966D3C60A0A3A977B37516886C28EF386DAC38385699BD29ECB48FE4A864AC9A
13997 FAB7B3B5DCBBD3211FE05680284BD50D9DCB2D2BC7266EDCC8F1B93AE9504438
13998 08017A279BB8A3FBD4B596BDEF06FCD73E9755D207FE95AAAA002172C3555030
13999 176418639001614499C185943691179E351A119922DE928C8C6D546FD77FEBF2
14000 01D9E55B2E3AE02EB5DDF6A31F01641FC71505E2E9E11C688B7347DCA89122D0
14001 1D3FF29FB92FEF1C8728F64CDB147AD4EAF2BF195583D824B2BB07331E3D458A
14002 078E235A08B8BE47F16C0A12C166F342C3CCAA8E4FB3BA34DD2E646C10C009DB
14003 EA4954C42987D9B88EF3EE140EE1008F17C5128A778A840A418074615F7371BC
14004 4C1FD21624B75589E4B6EB69128E5F4DA6E168612031E739FE5520B72534DFD3
14005 DC7D9DD86354761166DBF57784BCD075E22313DE20457AC527BE387378FC2323
14006 93D8A5F22E8F118E5F41FEDB6C1F42165F0D54454639F1EA6386DAFA0027EE74
14007 0B4A1080C9175BA52DA22F3FF78183DD701FF0D0FB269846AE10AE5316F3CFA6
14008 9EBD674FA7565DF18BDC853F8C093722C94D18F8E1B350EA7404E629DD665E8D
14009 B14DAE5A39C14B16C9695D49BBFCF53A39841CA1E81B31447C8C279EC6FFF847
14010 F654B6D836397D450CC951CDFFB579A56331DB3A312FE70F5091641F8629BB8F
14011 C1F3CDD80F0A14D38DF7EF2B0182B402E2795BB399EED6CDC9F059CFDAEC14E0
14012 F22B31CCCAE24620FE9AAEC1BF7AC43A38B240D1153A24A1B0BD174CA5E3CFB3
14013 9EBD284D514ADD0B01634B21EBDB9E19F1C2995B4E81C9A3D28742A9225CD059
14014 B50EF32846483BB59CA2C518558C49699477391F5DF8B411505C57787555106A
14015 2FFAFECC9BB7E6A53F452D174A5BE044F42EC0164050026C4E2F3D6337296DD0
14016 437B84A77E967C9F2E3512741C8D05CC9DB849CB9EB2DE70D39EF592578BCB79
14017 390BED73EE7BF6923BECAD6B0AEAF374556FD599C07882F77651E70D2298B815
14018 068C58BCA91885E74108E756C460FC1EB0697120E085C7CFD4C204DF37874745
14019 2C3A7FA3C689BA1CCA966BA9ADF1CAD49D2FF5470B9AD736353AC4E67A08B547
14020 001CD83C7BE7E5D75EB726F41E767DF2CC0BFDF1434251EB0D329E38BB43569C
14021 3E64D9D13660429D97CB771FBEB2856FB82C4B7611C2913826B8F71EC51A777B
14022 61BA7DC59AAB0204E38602D175989FE8ED3CB9D9391F0BC631BBA915976C99B3
14023 80E60449253E7C83EE7F2E2EA3A50A35202958FD1D63035C757B6E9D004859ED
14024 B9D667FBBA39AE8283306D13AB70D2E2CE7BBCBB788D520BAFD4A67ED9885D46
14025 4F639D0B81E85F287A1985E2D8DA265F872D639677C6C1E6A067F1FDBD28E6CE
14026 BA0277E6A66024E93C187B7DACB165BDEF69C0DDCDED8E9BADC63C39DC510E7C
14027 856098B5402576CBDF6A031338EF7755EAC857535B40D7B63D2E7272D9487299
14028 AC4C0D6FCEF162734BC08592EEC4FF17D667BB9A7801E03AD41CD762C34BDE41
14029 09073210DB822F668965A371DCE66F93FDE9781F6726B0187CF78E246AFA830B
14030 3560EBDFE9ADA568512DE96AA157139B62E63E55BB557C490E0A1E0F2E0F1200
14031 175BB55E65CA5B79EF495A0790ECBE12C655E3BDF3E2182424A7649C4838B94D
14032 02F5619C43E0BBB5C70BF02240AAC3FD9DDFB328F85C27AD29AC399228430622
14033 F9D743F680BE176C29F9B59BE5D76E4FB7BC2C470BBF18D406716AB49805DE8E
14034 E0BE989F253C99FED26938F3D6E34BC7190AC03C53A0FF128147976C7180525D
14035 C8E3D845D6D1EDF0BCCC48D652111D4EBDE7F94A2B6F1658F14DF709CFD63B92
14036 E85EBB77194F0EA9B44087B99E2B235B1427CCA26454EB04790C03B1319055F9
14037 47EFED6F3C802828C1F79C79684882969FBA58F8B0683C783582AED8FAD94580
14038 8DFDC255674EEFCAD79633F0154B6D31D98C5C3414F518FB7DB985EDFCD485C9
14039 A9D892513111286F70C3B0D3EA733EB51F6CF1D00396ABFC83060B0547375222
14040 A6693F97EE65914EA70B63E4E5D40D9B1A3235B5FC7A20ABEE6D518129A64517
14041 6E141357132A51B8E7C232FE3BBCAE37BCF5B4CDA696AF98E61A1393C227D71D
14042 D36979C599CFBEC0FB2CB6ABB6753DEFDDC722FECF62C99359340A3323DACCCA
14043 644D873E9AFD34DD1B695AB519714DC29C3E36FFDB7E29FB09B6026DBCEF3A65
14044 E83489E87EBB5D3F92FD236DE313A142295A8C7F0556BD268608FD711769482C
14045 0DA1F275D754C30476CF9BD308483B93A7A4CDA6C295E6949E690DC70B0401CE
14046 1D6544668A4178D3BBD1D06ABF29E4B28C7D73A493DA4EEC2019A802A795C555
14047 D9BDB44D673D7DD1E026AFD9B5D8016E8F7618B46D7857FB23AD2DE330DA2948
14048 6DC0FB5A32846334F0C2EECBB62160EDBB0473191678BCA02DC95684BEC04625
14049 7CAC1D69A47549CA07417E4ECD110CBC064997625F6F9B3FE408F50DD391460C
14050 ACA7DC16127925006C4F302C22053B595B877D7ACCD3A7548BFD10CEEE4DFFF9
14051 989B81F3D1279EC83215189E7D53065DBB672882A031A273C539ACB5B4FF9CC8
14052 7D51D65C3274FEAAE2D8D952700EF72E3B8520387B1CDDB1DF8E5E8E018203A0
14053 A52A00F99181551CF0D1D4D1D777450DE257261D57068B43EF2DEC578CBA5B83
14054 EB23F77B667D47560F3B3905C7D78626DAC13E567436C28A9D9D736D429DE0DD
14055 28011BE2A90CDE7BA89F220A096D98963912B7772ECA429BE03DDD1BDACB1A0A
14056 A3298DAB7E47A69E83A7FDB4E72EDA1894EF074ABE2C5A450D1A81769F62E131
14057 E8C384AFE2456913E4CD8B7697A9E474804EB3399EB1D34F6D0BB47D8B5AE4EB
14058 0C6234F466111098BE193B00152F3057855BBEF5F174798CEE274AE7843BFFE8
14059 3E15A84E7DE986BD29E622CFC80743167CF47D6C1BB06E0FE49EEA8528ECBF4C
14060 8416CA7B5E0259165CEEEA390D2DE1C38A0828FC2A6D8B6285F5C8C032E37392
14061 5D022A16D517E8C7520371A7972214962809046CC322DD3AAE8D1F23AD6CA5DB
14062 C05A791C9BD8AB03FD01A26120FDDDB27840C7B5F0FC99A106F63E9DA95D3698
14063 9805355FAFD271A95898634CB76B7EF07A23B1983AFC4148C96C95080D2AAB02
14064 95DA1A174ECD0102C5FA99DAF44C46E76F1421BE1C76E17707B5BF80D70B0A49
14065 024D38ED8B2914A1FAFD84DFFA3985EDC86A7750B331890A74C6A822AF7359BA
14066 3562E3D8B549EC385EE0D7D408B9C79E5BA65FB7E74FC9F017BEB0E3950CB4A1
14067 38CD5AED43177A56420C9927361C7138321AC39763FA11F08BAF3B741FA0B43E
14068 D2D2DFCBBDCF4B36EF6C9C3243247A485F79768AB4F5AA106D2E649318861FD9
14069 AD6BFA6CF5E8CCDBADA7F10AC70FF09E5DA0E3E71CBD4239EEA37BA5C17FB8E3
14070 06641DC5983673A80D0C523FFBCC153C670600240F96DFDB7D27791A41D784A9
14071 0C34E1BEDD84906B773D779AD2286C1C7C748961B3EDBA48770D0A5EEBD80F5C
14072 90609DB55252A0373B108D4EA3AADE0A0929542F99DE0F6E4B20FB3949E44D94
14073 AB088A91F2EFD1DC1AB0E70D6264972446B50D12A80EB00F9E62E353FA851430
14074 CBB4E642CDFC3B47C188ABEAE47B5870BFAECA629B4FB37728BBBEE7AC057A79
14075 5976B7AAAB09EBA481CD267B564F61D9745142652ACC6BF5C6C8E0F6A61CEFE1
14076 8FF3A61799D576D005E525A96E001AD7278A318F9B499FB5CA0A337D4197DA43
14077 F592A3A04583F3C075C0FE888B6E960E1C7AAB3C4213DB20CEED469E2447A1B8
14078 F27D469CC7D0E5423277D248141D8E4DA63289278925FFF9B826709AF9E12A78
14079 7D6CF9E1F77C86494D4A3577D445920797B2020D252EF0098AE31F54AE92F4F6
14080 00891540BFDBBD0119514D98A463F017731499E453BF2EE8960904B7CBB3F606
14081 4738952DC78CE4660DAF84AEA8C22734CDE6046F05D2D31C1ADD3166022BCB53
14082 78C5F0469607B0B968E1775F43B7724669B19576363E971760881AEA6ADA2C41
14083 B5D2591DEB1ECD5A3FA737526944B879E23DDA5858335E1A2F84B4F27F3B3FC5
14084 440F3DD5A1896EAD2373E1A6C04480D5469F07521A655FAE0F5944D260CBD811
14085 D2EEB18D4FA03E6940FC6E1B033110B62CF52F5B354E5E08C0FE36A2A2784558
14086 4168BC2A430D06DEE4545D87F120799F33408774069A906E35BE58360441902C
14087 88376A876EDE63682A24C3F9EFE4273BFF14BB7E08D5D985DDAE0158197E4887
14088 5B3FA6DB5D1980BE7AC4B2E752D2ADB9633FD0003A83685254DAB585AC14FD9D
14089 9BEB09C956D41B3683591FE504A26093A87A9ED4B5921A4CA409709FA7CC2A61
14090 A3473C6F0924D3C9C531C77AEC1C33CC61DA9514DDDA6A873BC0126759E52034
14091 DC73264AB36990D594FE1B2C2CA2AE907F303EEA8CCCFFF4777C92B255AC5E6F
14092 068CF2043B1A489E707AD15B135C2C79442052A2B9B2A53BCBAE7450A0F4ACAD
14093 CC92240795E6312E320CB9A2AB64837D89AF8F821BFBA75E06F4176ABCDC6470
14094 183BDA3D4B6BCA8A601BF9C6C6654897AB06A88DC601CE3DA0A4778486967171
14095 78F8FCF86B2600BDF5F75B56488A9621814FF1D8104389E300E223492EE5AC49
14096 C9EA48C69A5D39FBF00F1BD7FD0F6D0A3FDE5B519FF824236037C83A77756C25
14097 6A1119B4788193D5524B14273B0D52CA8AA19029C1A9CCFC5F15695C92C8F163
14098 2A05D0C9F34CBF2E5BEE5AF00720396B12D3AB9E2498BF607FC96D2ECF92AD53
14099 33A061F9323447BDD159F1A2DD3A24389AAAAF376B953DA1D758CD701C3969F4
14100 228CBD6D5F7213976AEC2AFAE98AD6F5BF332EA496DA503818E76C24D36E4A97
14101 9C9357FA3C6C26B465D408E7A67A3579A7ED352738AD7A0D5312CCB07440D88D
14102 FE356A3D2733F54341681378D38F50BC126C285E59CE23C69F61E1DCC90B33E2
14103 97882E29317BA96661945F4911597C26873DCC986EE324CF7BEAB4FB5B36958E
14104 6F19347C836B0D3BE3D44B0B4CC6D3E53291C6E7195BCAE0A2436D1409F50E42
14105 2BCBF705F516833DB7D6EE1F6C80AF0E3AC7988F22DD7D756E944F71743CBCFC
14106 A7D663523412D1573B768BEB3F2A238084375A5B8302ED2B74FBD22749984307
14107 1F58E2406D3AA0845785D860F7FF82EC4ADDD0971663197B35BF129E95B980E9
14108 AC0981D2A539A4556B9E82406DCA3D623CD171D313E7A34FEFA560C77128935B
14109 978C93CCACB9E409306866188181F58AA2949964EFF4CD9460C85EA5E5F01DC3
14110 355989AC465F9DEB15ECD759876098977BF70890C6613B9E83D73EC28FFBF4D1
14111 16FCC47F6BE71B96FA40713C2AE046A96B70FD26820F3962DA8A4C9A854BD228
14112 27AD7E7F8A2831CE022F01AF2550A07BD9D011AA776B58D20983A4C3A70E3E69
14113 D117EEC18C2D958FD9DC45D2CF5F7253FB5D2AE26DF1A1CEBB7577B627FF9FEF
14114 D6FDFA76A43D402C418743408D9481F15B64DF6A6F8D3212D143F7A5864B85E8
14115 C6E7BB26824CCF19FB29756E29E7F085C8D33946558639A461E692998AE060FB
14116 7403020E8CBC71BF20BD4327767293A9F2DA0BC0D8B6047621EA1AA3347D516A
14117 08D0145C825C78C9C864E2285393C614992A9169739CCAFD4ECE7F0AA58BBAE2
14118 5A826AEACDE99E785C1A8B2637FFC750593EC6B6552018037239B03D2D140C11
14119 32DBE09824E2B2F0EF3AD29C43D03202F172A99329C7E571FEEC33D547A17961
14120 5799442A1361E821570E9D7D74C7A2BBC4EF5ACF663DEFB98E4AD98C64950DC5
14121 A7D293D2C0CA700F03002746062D851A47A2D14372EC3DBACAD6A254F05CDE07
14122 3A17C26B2113DFEBB2722067BA36A6F3AD360A8CC19B2D71718C19D83B0C7F2F
14123 04705FE55B6F35124F9CE778DFFA335D5E99FAF90989AC7E1B13986F6D08D422
14124 34B3803A4FF311D52A7319C26D0C690B2DEBF68C0901C0933ECEDE0124A80CF9
14125 C809341750DBAA4E7CF3B15CC1DF4BCFAD1DE9489925EA09AD8584F96343BB03
14126 043F0C5F6D3FD56A5142B2E75A4245F4EFFBE43DEB94FB94C5167B5CC02E9A0C
14127 F47EE63D153CB8B941C8344D35777D39710B70F0361CF9789043774A411037D6
14128 8D14C7FB34A965F9245CE99910FFE6B1065CCC84B925D2EEBB3E2E8C05C05921
14129 73B4F4024C43C3D3C279260246FD78C82B8DD589E375C405756E4CAFF1FD4C23
14130 F90B67F79F3136B0164AB162420623DD3B2F19992F894CDFD0BAD703D41D43E5
14131 6522D30CF698674499C185943691179E351A119922DC35BDBD50A5B55EB9DE08
14132 6528834BEE3A0ED24FD66FE4C065450E0D7FAE48AD7E695E75ED10A025344480
14133 58A98B81B98E80520E9111B24B0BD4ED7C8E7D8A048A34859268FA7BF1D27B1C
14134 6FE3B2A2C6DB953ED292A6029B9963033044BD90AA51A75EC58D886995ED1FF2
14135 13A445A76021D7F914209AE12DC04D6D9B2FFDAF47669B66B7B4970CE005F417
14136 9B33B185AF2462FE4A142EF709DD5F9B9869CD06D49EA45E616C74F350F57D70
14137 8ADDB89C0AC1C6735D8FA22922761A4B3F22D894B6DA59541FD7E71B42B08824
14138 7AA035F3DC27FA986E5ED3585B4D9D4BDBBC9D7B5336204EC76F7A2C7CCBF8D7
14139 3B13087CDBF4D7739C0CE880CD47BF7D3C14CA769B19369642C65C282F513AAF
14140 8B8D797205E9631AE01222D74FD8202F8B19C8F7EAE856CAE129C39D589022E6
14141 59319C3734B81C2ADFF5D3E68A01E86B72C8D914AD83472952C896D6452B78BC
14142 5DFD5F4718CACF57593F4AB4513693FCA3D385BC8A7159F5E7576123DF52A1D2
14143 70340B3D4DFED870186012B60300ED2A954C28940F5679C50162FB62D8386DA6
14144 326F997372B9D307CF356EDF826289949B16E1A0789C6D4ED3B6FC050C6426E0
14145 43A109FD27E16298A6B8DC5F5AB1A617A324BB50A62CECCEE5BEE29A0514182B
14146 993ED115F2A60FF02EF6E59AB7A529DA186A60CB5EFC6EF5F845D8896FE4E7CC
14147 7C7BA7CAB73A0674B7EA6FED5E0B08AD851A31DB1F2147BA8035E5843B0C3410
14148 8C5548A8E678FA2A337AE1A95BC27711DC1CB2A8C54620AC0BCE04ED939ADCFC
14149 02E2FDEAD12F1710AFC302AB5458875D54E86F3D057FB5F46E04197643CDE344
14150 B5B9C92312E0FC17B2CE78565C26E2BA54191A806C68007CD2B2D2C50A373A23
14151 292B5BFCD5027A5F84AE69E00EB512806565F825B6EF780BD59AF9034C153CAB
14152 FDF3AFE46385F50CF4641D3A198A9A8877423FAE4BD67A6538B25FAA1E9F0AC1
14153 93470525FDB77F8C3EED0AC734005A70DB4931665D840B2B3297326D4053C7F1
14154 B96335CA7EF4D761DFC781B13E7734163772A9844FD3416099C56D124F73FF91
14155 CFE52109400315A0FC711872D308E3782FA0F6BA2016C33E93BA3AAAE6A0FEB3
14156 FF04F3FFA6EBFB243FA21C800F4B91B50946432A4B42120058F4AA7F45F16C1A
14157 080ACC735BE936B49A667CE543543538EA7D20E51721C8879B33BB7B918187FA
14158 87EFC6AAE69F735065A2F86634CF726914D1B8AFE8B5E7C494CADBDF8E740CB8
14159 960D9F79E244A59B27F1711E78CA5C6796FBB7E8B1E47E52E36696662F350EEF
14160 2CD6F86A19D4181FA2DA8EB3A100ABF69816E654BB8BEAA05471D5CB6D9FE95D
14161 9E88694DADF54B411296A5A8B254F45E4B3B61D5601DF1C80121D077C8403F2E
14162 719AAA194B50FE71C61100C985C1D70301FAA198384943804547EBA2564942BB
14163 5CAF55087EA04ABA777B17FC846017DDF490A9567DA1BA5DC25226D800606CA8
14164 51CD3343AC73C1BEB10E83BA1B89FA400DB65786B42B375704BC403306D6F346
14165 2574F4AEEBD76AC0469726CB0BBF6D1A0844AD12B1FF18B90DE8CDC18198F7A2
14166 596578B11218B80DED4D8F8280899AD800DF106A9747916A93649841C1C4AA6F
14167 AB75AFFBEEB315F71E5CE3496431BD1F1F91BA61EDDF6C37B2D46593E6BD5B9D
14168 548EA4AF2179AF87D099C6532CA54CB19158F279008D747BE13DB157FE8B6260
14169 502B600DA38D05E1FC21335CD2C6DB1B4E1D88C9D24DF5C2401D2AF137B002C6
14170 4B78E7C8498CF1AED5F21EC3365D3CAFF45C260475B5E59A5E40E40D79450C9E
14171 698CDAE6913BF7B3620B1C85656732B53BA02A02AECAEDF8B97014558ADE155E
14172 3F2F04EFB4C7D91581C9885CADA8B33DE67BA8284869CD0F8C738370C48AF271
14173 E1A55614D79249552B6AA31C8E89416001011FF98F9DD27AC2788BC968950BF3
14174 1F050998835D17EC04F9E247DC93CBDA0222A6A71FD8560AC8FEA256D9DE87E2
14175 3C22BD6B03F84D99BBA97830506DE264B0935CC78D1CF090385673DF614B517C
14176 05D31408F3BC6369C92606934553B76F7D4D915664AADCDA76880BF6DB4A3060
14177 4C566EDBC7AD5E41EB67DEC367C7C15CC63CDB81167C29B0DC1FF3A28002468E
14178 3F2B7FA84563B87B5F33DCF909620A5A8D1ACEE792409E5202C68E95A9E87F9F
14179 A03C6C4F7C0C60DB15BB23069121E3C7EA946ED443CCD40DFE38B2D5A73D96A1
14180 500442AFEC797FE4BFFF818D65A016EF312027D100E107806EFF044F79AAB659
14181 DEB9C7A4C75B98FBCE7C280BF78F278F612B880E6C0A328021F258E2ED8CF0C5
14182 56FEC47E25004F003D21EB64AB7F461DBA3ADC77B781EF03E5A9A982D357862F
14183 93ABE4BD017B134DD7757ECCCE492BA5A27A37F695DF8AA168A168CC8F58295F
14184 08251F5A676716C2788169EAE2DECD2D72AFCA9632BAD5821F1DFC9B5628B9EB
14185 5430836E9055B007398319845998E8DB36A612AFC7F64008A0AD0FF9FED81B71
14186 5B7825D2848D3EE6728594B13E0954C153C70024A354D9E3B12E08719DA8BBC7
14187 F25F4B6A2294708EA2A91208AAD4A9BBC741300695974667E4891D6570EC6078
14188 E5A66C8EE4538217B82C3CA29E5D1A18AFED916200A361FD3F877909B1D48D24
14189 D6FE389E8E42B7291FAC2FE201D2A9EBFE7949B842211DFE481C7CA972F80EBF
14190 B33505DF478DB0E0F1876BCC699E4E2F828217AC85B4A9DA9F52E5EF1CA0E3F2
14191 D03F15752D5A8AC6330D1CA97C19A0E29BC3ABB62E677AB94B9F889AF76C8892
14192 B8557C0B47319E38C8A0E5DE51170A3563B3EFBCC6810BDD121278179F207D38
14193 127A0B76CEE9F33B540E92D6A6FC84A31994B0564ED54ED5D09F9D65CF4004D4
14194 5E46C99A54C27C39F5FA2C09BA5CA65F50D094AA31D12FE284FB598FE53D04C6
14195 21EEB2666A6E91F338061A7AAD14E9477F51FD2E3A3BCFAF06001D373F368AA9
14196 0108755EDA2D28D2F0E3C08518261595698897454E6A217DE65EA79405DEBCC5
14197 AB0E3C815F7B88F4625A5B9A67C372720840A2005EB6E86C8B330BC024E30E02
14198 761FBF8ED90051180B6848B37122A76CED7408441F0F46DBAAA41583525D7D83
14199 1D1F89F26B235C8272114B9BE89A9DC161F717842C95BA01B3AC8C942B486FF2
14200 3428DA343DCA5AE981432C2F7D54CA39A47DBE5853A54E1F219D7E675AB9D646
14201 F40DD2103D5CE3A6CF8AE233A8DF665862CF6D6C4ED2AACF65D8C8301869491A
14202 24F2CBE98D889C8F65A08BF76FE138F8B285BD34CE8CFB31BD28018ABA74080E
14203 9889E72C81E3A4BA5BF6E400F8E6B3A5841B625AA42838E6A2B583A9780ACB70
14204 B4C5EFA4BE0463CF342DB74C0F823586C5AE85711397B996D57AC1E711AE61D7
14205 EA73ED4E5DBB1E86C46594AFA314403CEE6A17F843759A4F76D54F616D3087C7
14206 842A9D9803C2015FB66AF7C3D53BCEEEC84643EEB49A2E57D435142AE284287E
14207 F86378C70CBD25D789499339C1D63F2B604354D35A708A36D89A354AAEB20A95
14208 4E4FB9682D9D6450A87E092E839A1B7D5BDB6A12AF45EC3737E2436BCBD8B6A5
14209 A4CEBE2D2B9B963F299DD0A744E74749EC6F219A3BE37CAF615F1566DD1A57F3
14210 2AE798A28885ADB33E9D0BFE9B3A57733EEE3737CCD2EF0F44CFB7357BACB694
14211 48BCFA30F4DB2B4C609B66B55346267A3084EBB4C9F7C3E39468FAFC21CA086A
14212 0F12B55F802BDEF292F76BE4155E04FCDDAB10699FD9DE0FE4B16E8398AF3C5C
14213 9A0672AC71BFE0C18511C0477D9002FCC4831A04637C7F8C7FDD6EC8276CCE6F
14214 3334E8BE4783922E4EA8AC36D36AE4A2EFC306EA573F10EB1CD59B51A8DA748E
14215 9DA0294BE09A0ADB419B74A2372EEFD3E81131D86B17CA3A9F3687A89478B42E
14216 3938C18EF7954B6BA1ED86EBD9156CF922E58E7807335689D24AA6588FA7668C
14217 6AAB600242F4C6E9B56DABA83EBB68F11A3FF9D1825605DC790A8DB13F2FA5AB
14218 3DD2637177FFE4CEEF8EA283DFE606BC8103F26C025DA6B6B61CF594151A02BC
14219 CC17F2EF5DDA924A34963B5714AE2371E5F59882F43434D1737139627534AD07
14220 D144F71B66C8D25272E0D6E2424A14DB099C104BB4228CF8E4BFC93316CB94DD
14221 FB19DE7C206BF3DBEA823E5915799C49AB3D198F7C1A2C9D85C9BAD8134F8104
14222 E579B15AE40408086E8E9743496C9BCF6293494A9E0F0ADE16B1B51608916630
14223 5ABC6C076BF355444753DEF21BF0FC5CD3F86266E31EE84502851782B008A9C7
14224 97555294F65A2924F32C783DECAC2030C8E1A7DB3383290FE97C22D1BB5E9628
14225 58BC47A14A22501DD2F1E829C6F11CF375946EB18D912C4EEB1B298E293F0AB2
14226 5951B0E44ED956B4DF78E961CC203D503A36CAA3B623B57B19538538B502FFF8
14227 0F863914A2598842F2E377875A9D8410B60C8C4CEC87BF0DEA2CBC1970257D3F
14228 007E12012E5740289AF8516C7526A1326277764A401A9585AED5A3F78EA3DBD0
14229 040D7A49AA2ED063E09CC2C594918BBC8FCE9455245A4D61B7CC233DCE7D0201
14230 021844B03FD3D0EF68A82D002714976DFA440F699C497421FD7EB82931496543
14231 30AB9BD2DFA738A733E5948813DF4AAF7D7FC8F372E387D812500493B621DFE4
14232 89B0C18F7DF1C195C2AA763761005268C5176FBDF63AB5C8C05772DDEDE0E655
14233 52D5A98752F999196598DCC1D962CBAE36CB004348446ED2A593D53445C33C5C
14234 30143E503AD11E941A4CBFCB6E9368D57638F284B4F17FA92C75E1AFCFD552E8
14235 07474C8C1B55DC8A6F98D6209AAF1D7C7B15DFAB7C71BB5C6D6894BEAF5470BF
14236 E667B851364731D15BDAFE072BAA63B5D29C6109C35009D36F586FCCDA2B4CFC
14237 3B34EB79ECB0F9B9431457A9C3677D6E392B03752E550083414CCA4FC0F4193C
14238 F96809C6824C2C974E1F610F5CA843A901931E259383520951096603724F0C2D
14239 94AF8245A3EEE3B424DE27765EDF29754CA4E0E5798A6900B7B4529AA76B41B8
14240 76121A815852BAA6ADAD9979B3D5CBF7CF00A3859AB2EFB53CA53682897671D8
14241 809BA60611209467D5A8E942388DC5536DF009755A9C7AE2418E1C5D0B80F4E2
14242 F77EFF72AD69DF34EDA96F22E859F20359470E5146F225E6CAF23AF47367C969
14243 E654E99A5F4AE69CC674A94A43B414CADE8D686AF0DFA160DBEAD86A111D83A3
14244 B0CF52545A134E2C70ACA46E463F9C541A7F3E4FD2B7209594C1A4D739984682
14245 882AA02CA3714F7FBBA8E65842A251F680E6488FE38287F07F182597D99188C2
14246 2A33EF29A0A683FC3AFEEA3439CE5CB639D35B0524E8E01B812DCE7AC489A2A6
14247 FBF724AB4C5C38808EA26294E3CFD772B8800020A5C7E92654D3A5E4646D5FAB
14248 13EB3CD6D17C686999CCF18BA1794B20613BD592CF03E17780AEDE97865AE8B3
14249 4236CB3EC967D65786518EAA5A911983E64438A940DED8C65F0A7ABFB37266F5
14250 6ECED9AFAD12ECCDEAF557CA89303C742763924AC31F1AA87F27C84C687CB35E
14251 0961F5635BAC5755BACB5DEC39A2CDA2AE55DC9F2A4605E9ACF975EB142D847D
14252 2330EC265EBB0888529FD33DB84996461EB16B2A15AF8CF8192E557CD03547DB
14253 5E0F3F62250F6131FC759E562EC93AB168B99FBE201D099C19546107F3000B9E
14254 A432A32842B88F2CCC393CA098ED9C0E2A7F44D7395A461E591849F1087956EE
14255 B215734183C4FBF48F3EB04B5BBFE64BD4B37C0EF84C6163E6595775DF004212
14256 1649BA8DCE9298ED88144BAE07CE61455A658E92AB0E7ED4CEF0E5CF6B9F2E4D
14257 3F869CF99D0E043EE8AA7C8FDD5A643E590AA01CE607E74D92B8CB13D20981D4
14258 556CF327F8B9C4E11F44B3B1940F9BDA440D84AC0B2E8D722E14A1FFCA570545
14260 0000000000000000000000000000000000000000000000000000000000000000
14261 0000000000000000000000000000000000000000000000000000000000000000
14262 0000000000000000000000000000000000000000000000000000000000000000
14263 0000000000000000000000000000000000000000000000000000000000000000
14264 0000000000000000000000000000000000000000000000000000000000000000
14265 0000000000000000000000000000000000000000000000000000000000000000
14266 0000000000000000000000000000000000000000000000000000000000000000
14267 0000000000000000000000000000000000000000000000000000000000000000
14270 %%BeginFont: SFRM1728
14271 %!FontType1-1.0: SFRM1728 0.3
14272 %%CreationDate: Wed Sep 12 2001
14273 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
14274 % See the file COPYING (GNU General Public License) for license conditions.
14275 % Converted from METAFONT EC/TC and LH fonts:
14276 % ecrm1728, tcrm1728, larm1728, lbrm1728, lcrm1728, rxrm1728.
14278 /FontInfo 6 dict dup begin
14280 /FullName (Computer Modern Roman) def
14281 /FamilyName (Computer Modern) def
14283 /isFixedPitch false def
14284 /Weight (Medium) def
14286 /FontName /SFRM1728 def
14287 /Encoding StandardEncoding def
14290 /FontMatrix [0.001 0 0 0.001 0 0] def
14291 /FontBBox{-174 -318 1347 949}readonly def
14294 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
14295 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
14296 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
14297 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
14298 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
14299 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
14300 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
14301 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
14302 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
14303 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
14304 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1CE04D37507C3E
14305 D34F972BEDCDF781EB838C4B81CC7415A3C76D9C58D33F2E1B63328CB3163A79
14306 ED96F2271FB9D8AF720E71625E7EC8B297F556E4E780A7B5AB5B83A955BFF588
14307 F9F1D3F3CC4D5DD9C8702A431D1FB2DC1B2672A517B2513150B5A7C0C9ADF3D0
14308 25413F088E062F734F9572FFC91D97769D57AB355AD57DA9D9A8CE6AF162FF40
14309 9E77E2564A583C640601137CA517F9A18A462586FE920C1D4F8895F80F05C1B6
14310 C277757414D5D7C2769E37A67D9653FA81029DC6210ED534673F4E245E0C1A10
14311 F5A389F8815AFA3E225B87955C8E790983C39430C75F6F7672FE8F5B5D10CD98
14312 EEE3E79CEDBB206154AE310AE26167298D99970FA8274E44627C9E8C6EA15147
14313 5F538D77CBD1EF75B61DFBD18AA153C32B6F3E314DD950DDE193E5DADBFC0F08
14314 14EAF3AEE8495520BFD1D1D31A9D8D9A2E50D9084F83D0A6790668F60F7AD6C0
14315 1B95731FD323F754DE565885045369AD67944338E2D7ADBFBFF919016A865BC5
14316 84C7A9FD262DF82DD1B7A76B06A348EC25EC950E250511BCC1C0733B0D928EF3
14317 593C942539038A14C7FB34A965F9245CE99910FFE6BA51649E9FB697DA050074
14318 D7A7D21A099F2A7994FECA8247297578194EC04175994EEABB0773E2A47F6D47
14319 3F9756CE0C1F04A2C9E2D91E6DAB8619663C9B54CB2D539CF52CC6B6D3A523B8
14320 0543E5C5B99A35368D1BB6597E2C64066026BA3190DC801879DE9FEFDE29A5F8
14321 7B523A256EE64261E544F90ACC4955B15713E6104C0F8497EB926D2E948E317A
14322 4C2D8A84D6D5F5F25B800280517EF8AF6C244137E1C43D83F2E814980A99C822
14323 950233FF0020B1749EBBA97830506DE264B0935A66685A4FEA2FFED40032E538
14324 5748A6ACCDBDEF0CAC869DDEFDE714796C6BA453A9D7D12A2BCA32173A19DD82
14325 C80647C9658CBA9B32E2965FA547046F7E559C2E1B1D6511AA5594AAD4403F7C
14326 CB4FE283D388322456A86C09C7213CCBFC275E70EFBD1B678C8A58D421088D56
14327 F247AA68F869839BA984A39B55118773D1003F307FB7354277F8AA28DF50B54C
14328 E2DC59D3233BFE9285ABDF1F5DC092924B8AACE60F0F74126BF5B5E0CD856563
14329 3F5DCD819A8D5AAFDED9E927CF9662EE86C30D08FE14636D68F5C3231B5D0662
14330 B4FE3DB2468B1646E70C1186AC740FB2BC843D925EF0FAFD1139692736789AE4
14331 DD1FA1B5FA671CA6DF05AE8A910B180E6F9B009FE6F90108A0AAFD90D79C4462
14332 598DF206664AD9DE7E2D0BE8AD9B6D7947EFF830400F32ACAE284A925DED3979
14333 05EFB38ED274B370DA4FDABB121EB8A905FABBE98D164A1706AFFC8A5A95D881
14334 87D73526A32605653B69A0A256ED3D434667F08CDCBD04879C7498AC8B95E994
14335 FF0C6A61DD6AB5087F495FA3D8DA9F8227A5EB413E2BB41A07792472EDFB53F1
14336 4E7E4BAD77A4F4F3BC5A13F3D03F67B2EFE6358C6E3EEC6DE76639407656B54D
14337 C757EB089D71F5D7BD278EB41129B5EFA4F5C59B359C2211372EA8D7C0328891
14338 BE5F6A0A3116A2194688C693FAF1055EA707AD52D37A246656438AF684E286DA
14339 A6BC0B8A4DE3B8AEA25061A657D60E2C36D1BC7AF35453FAE1D2310E47026411
14340 96A40F406F24C1A9FB01F1F827C301EA631F6E521DA9A415D6BE607E48647905
14341 DC47D203DCD58E87A9DCBAC079DFD26BE7AD8EA2D015F32850E95B5786855E0A
14342 B86FFB48391393FDF4F8917F93E2E265838696FCE1079C8D314319F806306D59
14343 01EE0839ED51FF8A52DBF387BBA099512BDA1617DB499C384C0933754475B712
14344 B2AA3D7A821837562EC68A2DD2A76AF914A6B0EBCEF847AAEA25177DA75BA959
14345 917DF9DAFE98DB6C269417F3CEC3BCCA32CB4A81C40A66FB11E8860D37C71444
14346 E570E4FEB136486916B2F335A8F897A5D340C63110953C3020418649370B3B7D
14347 5CFC9723DD7BEFE15EA4C7A623E7DB883B1F2DEA306585AF745013ACF56DC130
14348 824BE562A3086DBE301E7B0080435752CFDE4501FA4334F2CE5D6972CAA0A30E
14349 8977819CDE090D0402BF4B8ADD65CA6F816E5103458E498C6D9AC75C7F141512
14350 43D996C8E15E5A5D1C6A8229A99A44D0C2556466F254236B7987E5EC56302420
14351 5C9F1790C43CB6EB81A52ECC936BE934C223F5AEE986E081B08C8EA86321A3F4
14352 EA849BD899A23EA5FF4BFDB666C49BE08571244BA8D628C26F57A2339A42F150
14353 6642CBEA98A65F3A016FE652A15332434667F0807138A5CC4A9C3987247D00F5
14354 5E9F16B3DBCBF3CED35FA769840D3F413E14651039A768A4E292DA4D6B1FDC7D
14355 C07EC2DBC4D52A4641E53CCE32565FFF84A6E42118CD542959F98DB3DA44E328
14356 42B62B23F955180A3B7278F97EA37D3A5BD929E65ACD2E558F73D7A2822936F1
14357 40D86E1DC900344753C23C732A955EA285C94FA8A1DBAC0ABC96649F57DE7E58
14358 C30BB08FA6F196D57E8DDDEF4C2E45885C5CEFCC1896163153862C4E061CDA06
14359 9C1E3F3A9523DF00845ED41E7139AB929E54C9706C3F9957D7D204A06E5E8AF2
14360 CEED07C803EEB81921A8EDF13C9B978671AC30C5C0AE9AD9EDF128B709506573
14361 996FFF006F8E439A83785242ED0AA53658E3D5C2D1527245991AF32AEE511D4C
14362 2FC7273AAC1D10D438E97D957AD762ABFAFDD1A907731CC4FFD460B10A365985
14363 F7D9A1CF5C0958A2888014BA9DC7A08708A3D6B29A7DCEB2DCD67FB3D5A90094
14364 2739DEB8C00A23AD7607577534138AE4B15D84C4B7B5C22AA1F27153C874C9C1
14365 1EE19DBF11EB76A5AACC26DE48CAA32EE2D617F29DC00E97AC2C7AE76BBA5C36
14366 51E885B6D6504FB3AAE54AB6961885232039BDE3F089B8367EC3B1722EA7E5E5
14367 737DC1F176ACB3B40C2AD6E5D354F8148CE1527CE2C233A0C777A8F534CCC906
14368 62593F645D7349742ED08E46570AB5F1AAAF7CE7B90B21A1C48181C93F2AFB1A
14369 F995800CF2B475A92576D75485DC48C5F13763677F45E7D1AFC398052AFA6084
14370 238548B2071AAD22383A1289A36BD5D285F8930589675C0AA9A73213FB0E6379
14371 0DCE125B7AA8FF4E920CD6CCFD9ACC174A587865EE30CD47FD348701CCE9F0EA
14372 CE9F97B599A149D9DF4382D98E1BEFF503D98CFC0094A30004EBC8FF46379DF2
14373 79EA92A7A00AD0CC152EAF04B84479FE9FEF9BEE08C93E676C586112DFC8F09D
14374 662F0F8AE1482310DBFF5032D8373A9095009EE2DD94C933D90900E98009AC80
14375 EE711EF4C64769914F7002F5E5E97097A781420C2CA15476104F2D781C3E4B8F
14376 BCBC19C7FCAFCCCC572024A39B1E7C85B8C0CB5391897B6973FAD7D4DB3A87A9
14377 2AB9F75DBC22BF0BB27A17C510EB96166EAF88C4646B5B6813BB2C0883CB5E34
14378 FD9DF5E66E8CA75AA379732957AC35E2C07BEEA5001890B5077001F6930F992B
14379 FE65A1CF86EE709DA9262225FF7F84DFAD1444B44DA94CA557CB25CF943BF286
14380 2E7DA32DD4D7C983AB5B84BF5808B927227E51E8644467885CF24C7147748E12
14381 43084ECD3CFC5FB9DF70E9E4E278EE880D1F0CCA7F0A4A781BE4AE8AED69FCCF
14382 546221774A27EA8C65F40390BE8BCA0FA476D68EEE1DCC3212B0782FE5B1AB82
14383 6C136BB7B612146B59593DFFD0A0CADE1F0CE5EF8EABE0C39BB2DEE5B7D67984
14384 9CA4A8C0ECE1688BBCADEFB7CEB4ADAC9C7D63C47155ACBF85B44CAD1DA73866
14385 EEC0B930F855F2532796B42E8DCEB86D63748C2F59663529B2D2C996F6D627A8
14386 31C809C50E4D34C89BD0A034352C6FFAA59A53D62B21CDC8AE308ED0033F5C21
14387 F590AF804B59DA2B6F1925BFC9594A97AD757E26FD8571CF8A722C5C9BC654EB
14388 E2158D2B3338E680D589BACA955A6F03B58AE362E9CE86EF54F229DCD2B9B532
14389 A58983B7E027E7118DB42E8F26942E63A76E5B77BE345D2AA073DE95DDE11F5E
14390 D2538ADD45B5D7CFF9739767252F02AB6A1C609C8D47E181EB5A6CC3EAB27716
14391 2366D2EDD758AB2BFE0396B68CB1B331B0B74EB6143DB7A1CA1986832A80B7D1
14392 C518A41ACBEEC17D5A5C31F27D81AF705B61BBBBF32C79B3E9EAAC2C9378E535
14393 0B764BE2ADEAF899B491DC118EE3C6A203FBD7B0C3C3EA63840413AF776F6043
14394 0A09793A4DD6789DD382CEC2720EBFCF320BC34D948F1A597EAA14FA1A81FDB1
14395 FFDF88410B5D21D4F5AC7D67178C57421A80DE770672A0F63069FCEDBF29C1E6
14396 DB9E8F7F08D441B2C4A672EC627172D10DD0A115AC0771657F8B57985CC6614D
14397 A60CB611C44049B6D4D0CD80907B1BD807C450CDBC14891BD1425DED198F08CA
14398 AF7D7179806883B57AB1597065B9B6161CAD3D4BAC7397EED2F5F4802FF6BE26
14399 955C7510EA319DE1BFD1A5A701A39483087ED3F80509D1099F9B38848ECB4BC8
14400 31F7B50B04B6F7E0A540F052BA6BE150DD5FCD6A8FA6CC0A0610DC07304177D4
14401 8E8505D63D92E4238E710DBF20CB16004549A9F94F320F96024C27E8BFDD8648
14402 5DF69A346FC66A801D6CFEB35227A30009293EA02C4BCCDEE4619834FEB296F6
14403 60F08D58ED189587B259D373C12201BBC92995926A9D122D5A091173001AC878
14404 E5E787A1937AB387D433E61AB73C6932C1D14EE16527CFCC0C2AB03FF7315679
14405 AB27274188B56C177DEAB05BBE6D0EE4E8CD0200BF5AA937C3E4F85E260591C1
14406 8FC29F0E6F448C738496AED563243111D02F4C22849CA0A1DFDB4F54C65218EE
14407 ECA811C2AF6A8E444AAD0ABFDFB6056DA72848745C4BAF967C98F3FFEB2EE32D
14408 DB5D5871C53A42F2A212A5EAC7876006F6EE05D1706F047543CF62B12E22D00A
14409 2EAD83C3E17923AC043A9D478C747A1A9DF6335FDB8F27314624BB3896BF938B
14410 14C56F9054CC6A5FC0B48EBE4E2E8AAB7FFE2D24996CEA8CAE5A330D8C45A767
14411 5BD1F1DBD7802F663FD46D6C80AB8AF23481E3BAE442800C12D742D1BCEB2429
14412 52196B54691321A26F3CFB3CFE695C7E7C69EF37854A04CEED2D2A2C3BF7A071
14413 19CE5CE6FDCA8F409C2EA15C0663A852293BEB0F8F14FFC524F1863B823E24A8
14414 5D00263439ED8B2914A1FAFD84DFFA3985EDC8694C29D4551810F9CD2CAEC740
14415 8077B9CAC039B9C89E5776278128297540CA0CBA13092C3D6BC64335A2D3843B
14416 81C19FEC33DD6F4AAEF7DC268533FF40B8AC03FA7386312D6B8983FD16FA4A50
14417 290CE3767FB3E937DFEE17D6A61AA95C29530006B4B1E6EDE30C2DE1F0AB31D4
14418 ABE6967E142AD6E6993375D15E52282BCCD4BCF668D5837386F411D75E8910B9
14419 FC9BB5B9184CCEE3A78173A5413651788700B06BF940C9D2C3516B02EEC66227
14420 A201923458A4CBD572A87DD3836D138A37113F1FF8D019CBFC09E5A519BBD1CC
14421 4C59310A424A723FEB45EF6BFA0E83CCB997626B8A90340FC7D1B223A217A89F
14422 4D2BF60C13332BA7F24343D322F73FA305264FF924336AAD4CDFA6147FD5EA78
14423 FB55C05A5B9529EE5A20C39BEAE4B89B4B6A3297CFBEBF782B2971AFCDFB64EC
14424 06E1403DABB296D5EA863C5113E08762979DFE862B2AD1A8502AA1F4C18907BF
14425 6F97FE571A3C0D59ABC42CA6B28AF249305C797733F46E88F105EDD16B685189
14426 5F335050C1DD71A3754CBE0F6EB63109294271780C608B104295FBA2F45D78EA
14427 6353D69F7C12C354E556F341F6AE59EF8983E4C0342B38CB0D14B1D74A9285CC
14428 CEB0E3A49CF9DE1BBF84445B419270D83EA5D600257AE6CEC1D4574A03D067AA
14429 FC826AA65D60734760DEF66AB7C55CF99CEEF6B7D6F8DF9A818A2F9EFF74ADDB
14430 CEE18A3B3E903C3322A492C71A4B02B36764097EF7610C8BA7BE5DD49F25182F
14431 74A1E33F4444F02697BD13633FF5DBFE6C600CA197A396DF8E4ACD967644E8E8
14432 896F63BF7E3CB80D293F004B860B0E4F1C357058A90731D26E1F0C780C2F682F
14433 86CA4C1C2772BB6BD7125ADC36D464358E797A7C3359E48A05E7D9D90A23BBCE
14434 9224FFEDC73D6C31559F15A7D2579BF6C2A8B5732EADFE2039C2323E30283543
14435 A9433D44374524C1179F933605A09EDD5A33B53526DE44417FDCD1056BECF062
14436 74C81F27305F5FCC71287D2664399BE301BA7832C42F14CB466BFE091031B907
14437 4A7D51FC61B9E1F60F25897B46A848022F4D64C2913DE7A17817B18F3EC54D33
14438 E4A4647162F39A7A27484A712D7740ABA0FD55479C202D1F6B26F3600428014F
14439 8287F331B0686B3F00416C56F2DD56BD8BA04A72B924615C0923E2C98C35BEB3
14440 43C91E53C88AF5F46730327FE6FD443FB8DEF2950CE0B62C8CDE7FA0C18C73CC
14441 4E75F77FDA0B83363F3E8D78BF60D638935B1A0963CBBE3A0BA0FAFEB6BB53FC
14442 8888A16394563A49798CC22D30BA340FF960A57AD44273289B497A0A49B838FB
14443 E325BEA95EAE2A54BC217CD7B44A8234C2C29D11991BC8FEEAD11AD54E7A4F23
14444 564C48AB0EF3F7661F56792CFD4C5BF79DFC50FA3D836863B73259C3BFD7D34C
14445 4615C8FB39B4EB103B4374E8259DA30E04C85E2C485DEA27326918F87DE6C57C
14446 9A4BF9A70C2E552761E76569FDF3142A0DFF65BACA18BB002855C5F34B6CA266
14447 F09C7828FE1D16B3A4790D5C3BE953686782C79E1B4C3A52DF013B1DB1475E6B
14448 3BE84EDD88CAF81959193388FE5E2D2835A715DFD954C9B4211F1E0644AFC9EA
14449 8601D48DCBAC07EB9057AAD2D6BD6DDE79C8DBED569903C464311238CF9259C3
14450 2862D959E6986B97765060B48F70CB735F3C5B179803502A51717245B3A27F16
14451 63845F8284AC6655B4B7833DF7283F9582CFECF202198AC9470B4E2C6FFD620D
14452 EC891E1F362CDD867D78932B672192B741E8E813F56A1BEA33549BFB41FEF1E5
14453 D184C959108F096BBD543980458A682EA0AD0B62BA31CEB37C
14454 0000000000000000000000000000000000000000000000000000000000000000
14455 0000000000000000000000000000000000000000000000000000000000000000
14456 0000000000000000000000000000000000000000000000000000000000000000
14457 0000000000000000000000000000000000000000000000000000000000000000
14458 0000000000000000000000000000000000000000000000000000000000000000
14459 0000000000000000000000000000000000000000000000000000000000000000
14460 0000000000000000000000000000000000000000000000000000000000000000
14461 0000000000000000000000000000000000000000000000000000000000000000
14464 %%BeginFont: SFTT1728
14465 %!FontType1-1.0: SFTT1728 0.3
14466 %%CreationDate: Wed Sep 12 2001
14467 % Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
14468 % See the file COPYING (GNU General Public License) for license conditions.
14469 % Converted from METAFONT EC/TC and LH fonts:
14470 % ectt1728, tctt1728, latt1728, lbtt1728, lctt1728, rxtt1728.
14472 /FontInfo 6 dict dup begin
14474 /FullName (Computer Modern Typewriter) def
14475 /FamilyName (Computer Modern) def
14477 /isFixedPitch true def
14478 /Weight (Medium) def
14480 /FontName /SFTT1728 def
14481 /Encoding StandardEncoding def
14484 /FontMatrix [0.001 0 0 0.001 0 0] def
14485 /FontBBox{-194 -360 1303 830}readonly def
14488 D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
14489 016CA6B55C6E47AD7A9A958A6E22E00FDD4D6492D53ADDC90ECD778346C06747
14490 57609FE8907DFFFED75E2CF963A64C7F72488F4A02372BE681E9BBF09A9CE5A9
14491 3894F6358C244FCD46C148F1EB60DE2137E6D3079D6AE03B3724F7D7BBA47BC4
14492 41C27FFFDFF9FB7B7738A8D88C27573A53E244723E07C995948DED2516B6044E
14493 ADED62C496A56BC14483D307884467ADE985655A4712DD06ED00811F9A05BF9F
14494 BF2AC66203817289FFB5BDCD0445293981AF6F55928C132E885ED009DE1B5FB0
14495 C230370EB5156A8B609E466F00F768F0A52ABCFBFCE3514C0FDDE31E601AD508
14496 2666AD26D9DB386B9FEC80AC197C9FE7447928C0C6A2858375F0A1D7AD3BE53C
14497 9A926DDFBAC60D846783AA97CB86F804701BF53F7C4D18B925FD604F60231215
14498 EBDF4FAD73F2D13518E1901C3DA00ACE65647765106EFCA89D1F779B7E7C4449
14499 0E3054D357BBBFDC280420240DC735FE124B0886A477DB2F2FC67ED580E822D0
14500 24250C6EB277BF3FB8813258A65C5A4C8F5DD7A562C845A538158725AB7D8993
14501 B42B21510EA5BACE73D4F283C95E3519C2A57E3AA9BBFDA9985A02C89A1B80C4
14502 B2398DE9604CD6754938F3C1E246C6667EB5AE63242CA503AF97EEB778B275C9
14503 B02EECFC1BDF5E8ED894FD8924638B660B3DF0389B26F07F66277828F9C32E4D
14504 96613BC2666546D81798601CDC88BCBA132E87237F6CBBBB213A1FC6A1C3B41D
14505 7F6183DDD84538DA290031D37ED94651E25181CBBDA11172BC569AA7DCC39F40
14506 1F009D9FDA74CD50FA614064F804DB6B6C32690F6E3DD4A9FD29E632FBE75C84
14507 EB19AD3B385D1EC21D1B51A31BBB96590E4A02FFF067F140FEE124708585FC7A
14508 80EB4D0018C8A0156D07CF21EFE48A70B0B58FA824D3AE5E86B7042A1D260114
14509 8707D80087D9E42A3D7690B054DBFC6A4DFA72DDC65D3EA4245F13660A977FAD
14510 0DE240764D2443EB3A0B338F0E2E2FBB15CBAE0CCE6181B61328DDB881B62873
14511 DFDF6E28DADB46971F3989F980B33BA410C7E2969191DF8221067FF8FCB32BC2
14512 AA6286AC2394A6FAE5F8FDA6BC1CC3C79A0297F6D6F6FE992B3B2B1C977AD126
14513 7FC4B53A93B97A6516861F669A18E2B4EC0A94C489E908F9707242A88FD283E1
14514 BC19A5F2E031DE6A15DCD17C357CBC217B8FADECBA8B4D399B65AE5873EA9BDF
14515 6929B1C79271D5D4B4D99B181E9BD9000FF23382B2D3DB8488DED17A0CECDD17
14516 8D4F777D2DC7496CA8A54DD71AB34760F8D136DB14CE0422227FAD9C5CDEAE55
14517 D0B63CD271B1E47E7F401693F823CB74464DFF46A8E8006362003FFC46781CEB
14518 7B94FC6FB53D5E18F74331CAC37712FBDC504BF7FA65CA458D73989558C19835
14519 5440F8790AA62B3BF15A00653A1ACFFFEB527E7F7C61BE8D5BEC4D956033639D
14520 38159C8476C9CFE9935C392AD1DA47315CDAD06E458370375E568277259E7C8F
14521 DCD0BAB32D05456BF5D7AE8F0D31B4A97DD3D6B5919748E4CF0BD89E71C3B1FE
14522 1F6A7D695F67EA1C7DAC77DAF51945B5B66DF4C58330C03364C7CCADD3F47A51
14523 63872D62E9258139EA4493649A1AA943D844B4F859BA49BD779C3C7F55CA5E6A
14524 DC87E473C3082F63B9CAD6F0E10BB869C910B7A7DD6EE645D92DF2FE97C825E7
14525 D9AC7D0D832E1739DB447C2E20479F66F3BECEB3463060EE1AB3AB803B0FE738
14526 CA05A3B890E925D24B1A40805A1E590FEA12378840D405B31E18DF51010B078F
14527 87BF7A118835ED8B2914A1FAFD84DFFA3985EDC86CD07EE29EA1FB1A23DFA701
14528 2316E7524FCDC9A9B64F2ACB9AE564EFA4D189AF425B96A23166E5930F575D71
14529 FBEB6E8DAEFA16E93C1F23A609D25B7BDB40CD67156FD2ADDE16CA010DAFAFF6
14530 DE23CBE6A297CABC8EAFF7A9BD9C333DDF5AEA2376B02DD4BC9491A7AAB3C0E5
14531 4C80D2CE7C5A77CB6B66763ECC2E11B61E3186ECA0F4B8C78DAE2B9C27B25AEF
14532 0ECDF6D938CA8DB4E820A9C81C1D37C2CFB46A86BB206C8FCCE78BD758DF4143
14533 BE17E8AEDE9355F68F76666D8DA05AD3347EFE165DAB87E080AC09E9C57BA5F3
14534 730400301AF70DA75B71E12938E91EE829D10EA96F411FC522B7AC9A2B673EC2
14535 9ABDFC6725D92CD82BE2BF67C46FD82BEEAD417F80EA659192BA8D3B14B11C95
14536 3D943A53F880D59EF3AA782D066878AA0BC6B25828B17DC59AAB0204E38602D1
14537 75989FE8E9E983E50DDC83CC3DDFF93BA686CF408F19363660F3888FB7476BC6
14538 3C53F306F8DC7969D2C61BDBD1BE39602C603E1E10F060F08D58ED189587B259
14539 D373C12206A7FF8297EA11745022C5854F50C7D92BF9E12981289C8BA32C031C
14540 B0D5CD360E5149E90B47B7990C1DDFD8AE8F680D6D36D2182564CBC6D032FD49
14541 D5AB137C104DDAFBE21B4F48A6FC603D3AB7CC8FCB90A018A8540F2A31ACEC2C
14542 AB047819D02B1ACD5D48A229E788CEAC05CDA985315C1BBA1ECF0CA773065E17
14543 744839EAE242BD3AF0772C9EBEDE3FC303EAE11BC75FBC706311191E76671B2B
14544 788F5C9DD15A93C258CC0A2793B013137AF0D768D24440C05BAFB44EDBADF26B
14545 8BA09F51156D3FC8A6CE75C46005D634328D15C87B45141AD506661CEB4BFA16
14546 A33873DAA93BCB493BD913CCBE31CFD5E8082CD99DDEF90BF7E49BF6ECA34AA1
14547 4DD2BDC5FD3EBB37B7665EA3AD3EDA4D4486413801D7244595F85A708F1360F0
14548 07C1D9B1DD84BDF52FF56B69C7A437E8206426CA4D5C7496EDB4748F1F95CF14
14549 177FB453C00D8DAF390C7A536837513B64D21A8A67E732E2D31DBF9729B4CD38
14550 DC959E22D46FC327F2101A79DA20D22A7E42C5EE670C5BDBB01B5E584B9AE29C
14551 03A9637040CEF206196B9530AD822AAF698BBC6019DF01262D349AA210D337A5
14552 940ECA307F781FD47FC6494038ACE864A89F33E4DF9E0ADAB5213B4F1FDC4C5D
14553 2CC96A89170BBC0019674E857087654343FBF47F4215A6729D11F396F3E8F5B0
14554 A60C521674011E5F20A3565EEA7543FD3B57466FFA35AE3951F03148BF9BFEE2
14555 2C49F950A31A6912A8E62A9B1A04B16B38EA429C40230FD36ECFB7110BC3DF57
14556 33BE741E34475DD07FC03ABBCBDEDD27BC5081D0ACFF86247EB90AD067E26ED1
14557 913555EA18D207397332B2EDF5F85B60274BB4A257C251EBCB59D554360C4224
14558 F6F5F52C89AB500B8CB4E904FE48C9CC06F195DBC92377E611AB2CEF66527B42
14559 E3BBEEB91AF7DBA148EA83B33936B47019F4B8E6142FA206A67C4E0D4C2F5D90
14560 7241C2E3684FB04DCC95C91FD3967DD4DD10899F9DA100E0941B86A91682FE1A
14561 6E115D3AD9E9AE3A34049A9CEFE25E2DD3676A8A9148B7B084F049E32FA3C614
14562 534ED336D12D2DBEED22E79A0FB1561CA675565CF5D7D8FCFD3FE4F4BD5FE64D
14563 FBC77E33356ABA4D08EBE43E676816DF010282199F40F0545855CD71B7622722
14564 8D7E834A3AE1AAD75B6CA1F7DDFC5C1634BAE86D4F2CE974E01DD8658FD241FE
14565 7988892E53C5C969387001C142E097AE4CE80AD360F8212B6607CC677DC2C82D
14566 88B0BF013FD5E6B8974BE5945F9A65475EBFA9FFD29A2BB5104C2D1520C2A7F5
14567 BCA90F1C4EC2C43FBAF9579554FAE68C578B3B5B9E4E99E0CB11E1BC6B53C4BD
14568 7F7B19FFA3EF4A1695F7C504259AA7BA2AF43249CF8C2EB97FD427B53A043DED
14569 3DF77D4343AB2CA195E397FF2CA7835613D02AF3AD430E4910D17127ADA937DC
14570 5376219227C62BD779D9E64F181C28F6997EEB0669E532A71D06278E80D3F95C
14571 69A265172F7BA4EADB943CB326F29BD7AF29B296B7CB8DC3C8C6A90BC4FA26B7
14572 7195A895F9E3481F303A60F8B73656C412849E352286CD7622AE5A33C6003F23
14573 292A4025F44039EC6C7782152D2D1A294F807F1F62F1A0B45065C712E8F1BFDF
14574 2249916C9192FA09BFFFF066ACC1D5B24A1D21A9C8661DB8261859EB26EF39F6
14575 97D96749677BCF4784FA5D7977C6AA97121E180BCB0A780DF6F3A23713F4ECCC
14576 67FCE3024F40456A60D597EB580B568E6AAA0CCFC12980C2EF7AF5DDB5318F92
14577 C6E3178467D9742F029D0207E2671EF952C17573E56B29B99A1B541310852D77
14578 1E946E9945015E9DEEB9EB267B3A272AE1CF34945207A8DE2FF1F9AAE22B32C3
14579 902F0EA39A778405729FA64B31B890E10374F4F96DEC455C6D5DF5818344B243
14580 149AD52A9AD5758B0661B3A1D2DCF495C4E276CEA6BC2152B5D6053506C39170
14581 592D8006EE125994271F0B5B3A5148DF78B0A129E27B05D967B7A8CCBF477AE6
14582 756D1F0F15B85D1DEF007C70AD6B3ABE2F9E0CEC9DD7EA34D08C4F16FD3723C6
14583 DBDD597644CE56746B5AA9F05DEC2FF008B6A551B0C734BA5D0B92557611B06D
14584 69873049981545F3C77B0D14333731EFE5A2261DD2E5776F01B143AF21963903
14585 CA246CC8CC072B11B3A9CB3A8152AEE6AEE2613DF7C77FA59010166C27BF4CF6
14586 F0D3C324C1DCE8A5C8BD45A39EB35870C3DF29E97986537516A6AE978A93B63D
14587 FA25147C28BFB42CB8071B25846146E92F6241990D4781BB77FF203C063E2785
14588 B8DF71CD39F600EA6613C24B94E5EF76557212A38887ACDE5E1607ED163F50ED
14589 A0F8C55D26FDA5546087C2755D41C6192EBBDEF781272500E62221F1CB8A5F93
14590 23980BCB64DE2B5330FCF157BD4709C3FC1A148773265CA8CE7B00B9C3F0AB75
14591 08430357F9F16BBD72F77A2A67EAF68DEDFBD6AC212A8F865B4254BD6CFECF55
14592 8E6418C80F41383DA439E45BE3B5FFAA93A6003301365FAA8A319EAC27AA2588
14593 082F0B8255F7C59FCF9A8F9020B01D38410588C12A71DAE2B1AEF6EDCF144F48
14594 9EF7116D3411A7976AE7C60804E0E96D97B8A79BA80FA383485266754CEC2D9C
14595 426F11118E79D1F3E208CC5331338A70CD9080AA97508F31B47F46D974468859
14596 0F50E29F1C2B4D56C375945F7539845881FAEB384D5A2A7914297DB82A1C7C63
14597 DBDB5089BA3FD9A9AF7C7859A6D73166E498409C3E7865A3F2A4D7C07D7F20DB
14598 E0525068F66EF1B00BB47A1DF1FF08C8F7C11F685DE55A83EBE38429AA590198
14599 C595733339154D1E1490B38C4729C67763358A9D8FCAC8FE822A6AADFC7978F1
14600 4D1AEFB4E8861EC9C429D89D4A615C6BDC65E9CB0E35AA7FEF980E86CACC1794
14601 397E739C254AD742531C793970867669C0587DAC3A4A3FC5741841C1DB4D8D7B
14602 86CE8CC8967E1AEB96C181AB61AB535883ECE15C725DF295DAA85778099F37D5
14603 7B0B774F5D113689C1751FA327BCFF2CC9585594C26BFFD4D9B82BFD6C6FEC87
14604 6EACD334AF741BC17C9B26166C41870797CED5DF95EC3BC31D3FAB9CEBFA16EA
14605 009223C277E6A0FC6158005511B081A79434C8FBE660FCE3AB1CA99F4009138F
14606 DD4A500FE3367FB7912F09465E34B0E51B93068092FC5DA011506E721D1550A3
14607 13D43B54DBEBB59F1BD0C81FC14C6A8323B062077E9B579190F177BA04D63516
14608 D012A2C649F79101E4F7FEBFE0B9B47D3138F766C68A02E63ECFC910D0CB5503
14609 ECA5CA374B66AD2D35BEB5B4352370EC61FDCE1FC102430C3D21EB64AB7F461D
14610 BA3ADC77B781EF06026DD3382F6CAFC5CDF08C00E06E0195EAF4CE98CACC15DA
14611 6F4AF54314CE6897429392BF6CD7E211F0362C60E8AE3B287732A74504B07FF1
14612 CD17B88DB8F1AED575F353B94CD698C2545FF3E3EA9E4947FF31DBB8C0E4137E
14613 DFB48C71E18E5C612529C9B9A1C8C5D07AF709F4E111E6AB73E5C50204E881A3
14614 D41D0D5C29D2F108A9533884C477F6AFD2C8145096B54FF6F5A4270E576D84C6
14615 AA5616210C1FC5002FB5F566CF858A46BB2A8E36EEE2A9FD82ED56CB43228470
14616 2C5F6840DE3FEDA12B9E0EBD68F2F2F16D656471B51DE3F0A59667F9434CBC8C
14617 49FC0FCBC63A74396ED8A13930118AEB195F99F5CC39FBFC6EB833FAFE81DF77
14618 653E23B38B5C78AE43C01ECC659F95AAD35C824CA29486FF5A70949988BBB9BA
14619 75183946BF0855A676753D5962156E0C8A058569083D3ACB37905DABAC804D86
14620 0DB6F53854C664F25749580AEF74461289141BD0F72B8BA4F1C73CF88F2D7B73
14621 B08161615A3A0FEC0729494003D58906ED0FFB75A752349C5E7DAB444162C5A0
14622 669500BC42B8784CA9068A365DD2BB6AE0054AFD0A6A63D1991FA99DC5E168E9
14623 6F432B66041B294EA92A370CB1DBC3E3A472D0F81128C27406AF8EA4A910FD6C
14624 3E13692EE0F768C4DB825D587FB71E82D1A537C094D2865FE30E93AB095B3857
14625 5EBBA555936618D513127180FA8C17833876B152EF4C7E85E5FE283216A4378B
14626 048A811626E6E23AFBF5EAD2922C91F87A53D8F90EA0F50DD917C678B66E566A
14627 EB86DC98EA7FD3DF1943B6CC9BB157D64DBB0FB5F4DD67DD7BA657DE4A57B781
14628 D221C2E0C92CFF820CBFE1325FABDE1006E3D3B4E46E8ACD2DA44D0871528402
14629 0E97B3DE5A1C9CC82CA5E6AFE7F8F903401B6D1B1C24FA4195B170A79F089352
14630 1450EA2EE20051A03A7907A725B02F08D3CE3720E27DF57AB2803B20AD604926
14631 A1F1C84F6743B985FB8048A4BC9A1CFC4D81B657DE03ED3D8B47D42F92B61A91
14632 5C25DB7BEF54369232D006ED7A42A296FD715125533C84D7BD52D6753D037887
14633 C4B65A656CEDB164E81175CF71021D94EC9526C9D33DA9BF6443145BF734128D
14634 E7EE3E332B67F9A2F7AD02EE189608267FEFCD4B77D88AF7E79C1C3EE2794921
14635 34B3432C7098C8365C77CC210177164F2B8926E679936C6F0FB5C583BB6C2BBE
14636 65D92DBC4AC36FF1FD4909E4BDEA6DE170F610887C2951D0EA79B74E2523EC60
14637 880FD4C8B8FD51449F12FDD82E07269B8992B8A05CFF40BCABB8EE5943E0AF23
14638 71B964F478088B63669EF26D64903C2293ECE3F54980F968AD89CFE59086EA48
14639 03FFB4C638389984AC6C9CAC0D5C42C6A05E81B2D105CE93F5C9ECE5F23D7160
14640 AC59951938A6CB2468B9884CAACB562DF00DE67D6D7ED1161591CE32D509438C
14641 43FAE9E726935DDC68DE6C781BC3A90F49453AE90513339DFC42255FBB61ECFB
14642 18E5B960865727DB344F4C566D25C42F35F9DF4D9E2E6258639775B8E3FBC1BE
14643 8F2E260434DA3F383A3D91648E4D1C3409F62DC4A7E06E782FEBEC19FCC9C86A
14644 B4178AD44469296E837A400EC7E1709AD7D041AA4A2A0BEDB4FD0417227B6FDF
14645 EE0EDCA87B9DD51F01AC1C215C915205F1067121289BD5D224B674AB420B7BD6
14646 D06484536E6CD12016975E45F191865146A487F39426EEDF2D8A778070B8BC17
14647 E9EEEB848144C593677426C6D0EAB6CEC4203026504A89E904C8A3FEE8D1DD41
14648 3BCCD00AD66AC17E63377C756E85205138C6D48364F827389094625D5F7DF0EE
14649 62F39BCDEA9706D0DE9D78BB1C8AD739BCE8311E97C3D6AAC538B46E5206D476
14650 49CBEAE6B3681E9DC9275448A68077CE35CF573112328F242BC959B1043C438C
14651 31DCA9696C282A37F42669DE92439BC9D4148844453974D4E2BA32941BCBE091
14652 3AEA983936A6C8C647C4A9C609BC4CE0F7CEB2BF8873C5EAE2E987EFAB2C3C08
14653 E38357AEF4D7A7376984FF2FB292F30D853DC5E6BA25574158AE9A63EC8B2A79
14654 F39E645CBAA42FA469C5D3D0DAD543F52EA2C8CE22F4573497D3911E9D143A20
14655 3E58207099433AC37C9A52426D7B7A92E1EDD14AF6A4D300B1578B0EDD5A5709
14656 731FC9D8566F12B955CAD748A7D7AFA00AA426C021230148E0041F205407839C
14657 EE5FE6E077364AAEC290BE7E5B23E1025CE46C93AAABBB713539877C718D28AA
14658 6D2B287CCEE75CC9934D6D85F62801A8E30DB734BBDA14D79E285BAF06F871DB
14659 941811ED36B292EF176138A88B16C314B427BAEE5B407C7D0760DDA666B64326
14660 393AB1BDCB8F09A5FD1F4F26E1624D46FD02DEC16E24B30259FF33652B5A4204
14661 2A65608248E964FFC5BCA6260C6D7171EE900009F02939A2DDC1036C15AD7965
14662 A34D3EFF2FF4BD7C970E4C519F1957F990524B9E26AC8899CD0DDA28B94FE0C1
14663 266549069AA043DC9DC3A1916F717F3D3A277056B987A51BCE072BC4015EE470
14664 8CC47EEB700A4619ABC955B81949FC630E040810A1ABBF50807ED4A60011BE83
14665 8D9BD0ED7AAA3C8B95FCBF75FD8BE023F84AF0EB13CDF12B57FA61AA135FC788
14666 C24F631414952348DA6ACFD677876957BB8F2A6E556E4B4DC1DC674E2101093E
14667 0F11DA6C227B73B08161615A3A0FEC0729494002295A65E59B15E932138CAC1E
14668 F93C280ED713BC49BE2DBF9663739C9EC2BFD00F84449B87CA7435DC8A6088C6
14669 B0DD600EB57A2398AB8D21F15E4F0489411A07EF9D22EBAD05161A3755B730C2
14670 5AD7BBFE1B129C72793BB97F1BACCA3210B7ADFFAE61F254E934BA4EEF8D1F22
14671 FAD6B2B2205CE966D64206E29CEA77370AA8F4036F1FDEAA3482339446733872
14672 D15A03C4ED41FAB734278171ED49887CA8FE6A3D8C38765D189749B5BF650B37
14673 2BE81895323E3AF598EB9149B347216158B45D1F6A18EE93F1868E8A1B13FE09
14674 06339F84190D423B3D3289D0453701393DAB03607172EE79C5DD9FDADCE7C566
14675 AF4F33BB22FACE863530C12720DBE461FEC4C00BA33DB12CE38B8748686EBADE
14676 4B4D44AEA5C4FE5D7849D734ACF129915AEA5D9229D2B9C3178617094102719B
14677 A0211BAA88951B939350AFB9FA5F642F6F04C3DBD06FA117A4C160EE1312C969
14678 322A29DB6A06A99FADFDCB3D71CBB866B83429B3B61C2C80341A96F6EA8EB5F9
14679 411DCA747CC217F9F56A05CBB1CED6C8E458B116002CA02CAE79CF2D574DA359
14680 0A8A20693C795088A101B9AD17929380F2300C64BCF1CCD842308DFA9F80392B
14681 B4CC21C1179CB6CC1E820CF9FF3BE6283366F1A023D9A302B915FF910E63CB39
14682 1CDB119C4120D06F11537A60DFBA63F1F41CFD50D266E94B6698BB8CBF4FDAF0
14683 D98B1128DAB29785407C494E561534BD3373E8D679CA5B0244D70751A782DA56
14684 A87801D9E2D9E33F0E46A3F7E15687CF71BFAF2716D0CD766A6BED0621D11331
14685 9D95D79BEB7538AB553BB62BE5505F275EF5835B8481A630563711901BBB7D87
14686 607CD598BCC5F878307AFD49DBC0316AD8F7098BC76CA1F3034734D91AB4F57B
14687 B7CF62CD4DD8B065A9C410314EADEA7667E1851CFD7055E9ABA4FA6157046177
14688 B2AA37519058625F9BE81F48BEDC9AE6168B553544E0913D4554731662930C46
14689 EF20FFEBA5E9F09364B1D9CC41BF3EC1FC50292D3597D5D4AD7A723EC1071A13
14690 740C24145222539FB7772F7BD8C913CA0FB37FA2C153261F0C3FD7A04A188337
14691 9F1EFE481C7CA972F80EBFB33505DF478A291BF4FFEBEA04314EF677B432A407
14692 FC3DE88BEA659429113075463C4214B86E9F3DED90B8A3AE1101D011D41BA245
14693 44943A9593EEF60A8505E00CC262DB1D363EB5DBCDC224D07A24B8FCDF5B10C7
14694 D3E55F65BF2D76ED6CCF2D72FA9EC990BBD3BB8E9F0456538CBDF57CB889914B
14695 0B47907F08AF08F6C8AACDB2DD3A05D5FF8DF8459F1AFCF2841A2AFA548FAA2D
14696 CD12570443FCD3BDC6D5303B01FD7E57B5FC29D9462AC46ACFE18F49F24A85D5
14697 9CAD0DF85BFD19567EA7C79D38F0185046A500CC54BFF9CB2509B6551EB5E1AA
14698 DB190332B9E2CD8681B8E7BDFAA8640CF1B8CAA8F570AF31243F791A848AD6FD
14699 62685D5594F53194E17A08991F068276AE27BD060BA3F1D894998F5E1689C4D5
14700 82EC7328601320D896092400C26EF0ECDD2C058A840831A6C7BAD9CBC58FF9B3
14701 CFDF386232D13AB5EE0CA3B6F1D083A36F2D86CACF1A19AA41435DEE264B2C13
14702 03C0A8AC13EDD7D7770A365E51EE47062CA2E5FCA74DA9D0DC2F7220D4DE9310
14703 A945A761892E4EC266DD36179DC20D916022CC1FCAAFB4755A6DA5DA9B6FBAD0
14704 38E0B3CFAC13492DFC5B5691F3C42E46ED111FFD5C24E79ECBF33092B5C0A897
14705 31945DF1F2C118119B191D72DB390CB5FE2334D6C3920FAB1B2FD02623F82D93
14706 0B71AAEC9BAFDACF01CDF9B995F56BD2ADDE16CA010DAFAFF6DE23CBE6A53585
14707 A316228629C95194CE5B022D9E5BE211981D4C4AD169E5E49AAB53CEACC46107
14708 6AC11AC9E1561406CC29E90A51AAC9346215BAE9128FE3AD12C19DB89CA91F15
14709 452FB0770A2F452FE8C9CC6CD829EC27C0DE75B2EAC43B4C28AE2E120D2784FA
14710 A9A2DDD36EDF5C0F4E66C309D54D709C50864C1051EC21A73221F6C261EB3BB8
14711 02BC07CB5E51D27F6185B280E6D1E63EBDD354638EC48CC49BB358231F2BD650
14712 B07D872CBC01CED984603A4226509FE3AC29A30A2AB3DA276A716C0019C7EFCB
14713 31B9A798C19754DFBE0331BFF1AAAF7CE7B90B21A1C48181C93F28148572BCEC
14714 5B31B7B8FBD382CE9E7C4BD49171D146316BF9BA1A4E969A1CD9797E056C430D
14715 B1951E70F9E6E773A0CD4248B15B49771A3FCCBF9B37BD1F233A909C9E8EC214
14716 A37E5862A9B1F1B18B3EE2B87190DE965792F0DB75B3A2E889CE39385C77FF85
14717 D9BBC6A24734B4587DDFCE77CDB4FB7E107BF2C20144CC9C5846C71C6B636246
14718 6410CA7D54E62EE33AC73EF5BF683D9A332101D344D26FCEAB44FE0219E1FE9D
14719 18D7BCEC0562B4A5AD10FFBC85F554AD7B9F50285AB25940EDBBD3E7DAA26A55
14720 27A212C90AF62E7F928FC5A0DE355782188CD1E9EE8B39A0D38C5CEF0AD05B3D
14721 6881ACBC6C811D416F9B3D5BEA1B27BEC92CFEB7394D5B99D462A384FB6AEDE2
14722 7BE8EE0AD75D15E78F0848BA9ADB75D1044F2AC668EBFB7EA2F8C7D14F9D84BB
14723 AFDA9162508803FFAA8396C20649B62A7623E77D6B4CB1B888469DF34ACCBAE0
14724 A19741376AB9214DAA7E2F61BEEE532C5CE253837BDB4F88D88FC8C73B78F1F1
14725 00A9123B155AE0D48770DF217D0EA0772808BCAFC6ED4C2141B83BCCE1A6FF19
14726 F68BB415434B39403226C0FAE01FCD2159FEFD3ADC575B231CE23085742109B8
14727 7E6267D1DEA0BD8CDB7C6092CB27CC98610F35EA1148C3A85A094864E246704A
14728 91E34EC130AED81877EFE4EB37BB7B802358B4662E40A3AC96911A3E50E363A6
14729 563DB556E660B7C33D02725640696B371DA41952760A1A676F96728A9A20D13A
14730 D762131FC7BDA5A03B5DD26329299C925F3A18B2625F9556985A8E9D7EBDC78A
14731 CEC1F3EF29E775E1C4E4C7A4B82ECA8876DBCC17324EE79571B219B3843ACCC7
14732 82383CCFFF61D7B38EE8C9F376DD1FB9FBAED8D52C6EBBD8289D0E9A984A2C79
14733 30E118D43C83833FC8F45FDB5AE79051D1435B98496F7C7C0EA03255B9ECFB39
14734 FC538AF30515A1C8918D8015AD00E2191357C6E2736E95E6CA82F4D4D153235E
14735 5476F217324345F9908DEDB94A76DF11C173EBE1970A374869C3D4DAD6FC517E
14736 A536BC8951002536CD36DF87833C4576D24A193B4192900C12D6A78950B93F1C
14737 94F11476BD78B2325FFBA6A0E30E46E86A5AC1C86F26B754467AF668B9B8CD11
14738 F31FB75C3E973F69ED9A777EC0E9DB507F0DDCA82E589B79E9792A203B13D798
14739 64AA5D4F13695138F3AB74E12DBDA229F9630945CEFF1954A1FF65BD8F40D8D4
14740 64C94C6EA77630CF5A74F5D7E13104D5EBC6BDC8417DC9736A3A5009F8AA47AD
14741 7514984DFA9DADFB2EC71A920C9DCF97936270EFD297FF21A804AE3DA845EA48
14742 520CE409B509D7884DA5EDEB4B417A21BD6617E4EA740A3F0DB67B02C9F5B7BB
14743 957F7BF1AE787E8E4B5D7BC96FA23F67673A8174B5E91882518BC17AA8EF1CBA
14744 E9775E4E084C4ACDFCC96EB0914113B3BDB005D9CB9DC887C23A2C6C312C6349
14745 DCDDFD47AA39764C20D90FACD7EC702B7E2BCA16C510B999F2C79160207D979A
14746 968B940908D65F11853FB779ACC6EA36DFA64CD70F522B39834C2436CCB54BE3
14747 CC18124AEF1C56CD1A02B666133C18EAEFA25E625020B56DA1BEACDCF12A9E0C
14748 0F647788CF1CC9BD04C4512CCDAAD015EC8A301F9AAAB2910DF1314D19FB893F
14749 2AEA58EAC9CE6F847C9AC1F9BCCD8114FA2112A88D2EDB3CAE1DD1B07F793949
14750 B53EDE8601EBCC13D9F119B813E15DA2BE3090B1ABA25258E706979BF74311BA
14751 6B538C00AD7FA9FA044C5A574B9489FEFBCF9E2DF3664489047D91724BBC432E
14752 470A46784242143516BC569187AC6FAD645CE655C6349B7AD6D1E5BDB6F9AB1A
14753 F4056C369DA9AA0F8C0F3266FE2BDB0ECDC694C0A0BD1D1CE937890EC3E52020
14754 5FD96880ECE94B8E6EA72FF7EF2047FF0B5FE2414668CB1667A35432D5EAA610
14755 4B726CD2B9B1844E06CBB204A8F2391DB2EC4704E4C7DB807BBA1E3A4D1025B6
14756 30C13D74E792976737C4EDEC7D108E93449AB8BB31789982D566148C6B0021DA
14757 12FC7B595D344C554209CF14C15DFEE48DC1993EB5DBD0A3FD8A9F88AF43B229
14758 22CCAA63F2D4E96E9E422F75140C6CCA5B4ECFE34CCD0279E0F5079650DC8F96
14759 135F62B792A29C10E4F6E88D8CD565397A6845EDBBD3E7DAA26A5527A212C90A
14760 F62E7700027DEE6FAEEA505CC7FBE5464EF4127A46D1B94F529726A26CE338CF
14761 E5F50CF47A67EAB0E48C62DE18ACA26481A48A9E0AE92608B90F73C1DDDE691C
14762 8FBF4E59F6667E71A36A782472DB13758307085B236FFDB1A192D8C4993C3132
14763 9C0933CF4A100B0AA71012BE6D2CAE7E22C45E6E106E1337193110BCE6153436
14764 D889DF33A8E1101310206526A067F3EBDBCDD7922FD97A6EEFEE6090A1DF9AE4
14765 29B46774D148F993B882B61069D0DE94A4CA2FB4043AC7DAECF91FE837FB59EB
14766 975B479CEA0E6C6F76FCC0454612FAADA65EC6EC83FAA0C7E599AEF82993A388
14767 B8490DFEF8F537998597B2FDFB71C20DEDB1549725090BFC0596AE4F530A6DFB
14768 4AC18153AB8059C9E468FEFB0ABCB006353648DA6AE3131FC978766EBE596869
14769 FAF56CBF44E25C3EC5BA5C82C87CED6667D2D40F5C7F4B972A641B00DEDE85C3
14770 299C13270B89DA5C0C487406E9C1CC5BC9A9BE0E1BD0457AAD37CD2D4D036337
14771 A1D2AA8496C5E77D60C96DC3E56FD28AF18CB636FFEE11D9F2E1E200BDC0C8F3
14772 3C5668DE61906A2CC9003A1848DF8FE8E51D9DA0422B3C323AFF82271FE22791
14773 FAC321A688E7F9910DFAE65D713CCF6AF25C1057AE07F9762A049FB159F4C52F
14774 DBEC766BAD7F4C72F0A343B79E1D4C9D7C0C2C6126B14C41C029E9A4E7320D85
14775 B987AC46C57F81416876F3534D7B908C998341F7A53BB70F9DB3CC9C894CFD8F
14776 AF466CA11FD65D7207C5F92022C5D8E51485EEA0DBADB82856C6369D2A4F2C8D
14777 13724B218AADC4B026D06EDE524EEAA170C20F8FA7E85BEAA6DC683CD294255A
14778 A41FC4BFB36876B5A6457B892917CA7B902309CAE9B7A4706325806A394634FF
14779 7311FA695AFE6584F0A6F59B670996ED91EAE32DD4672CD37CAD66DB521351F7
14780 47ACF26571E3B2C275CD0501617022EC6FEB8BFCBFCD73E96480CE7F978D4344
14781 44E6BA9E6A2F7C2AD8E85270F4E755A55A19E0E76C59B1B136DFA6573245CC7E
14782 A6AEC349A681931AADA4A4CD53257EA2BCDE7EEAB1DCC71DCFFF624E035282E5
14783 FA1236ACC0FBC7C94A3EACEF43971AB81018E1A1443CA8E39245AFFEE4A232E6
14784 F9626745ECA614F78CB5E75F4C6636CE784EC1A7909E909D724509C98058B68C
14785 3CD377525003EBC0DF06BE2986C124C0DEA1983552C6E8A75E1DA22C4DC4CE21
14786 59B139C262332643E24582DCF397C1C5B6821791EB06C80B1329E92399BA1372
14787 6632F177668AF1AF59F4A534AD0CFB082B1D8E6D2353EC3209A7EB25C39E8AE3
14788 44232978D1FC45FCB84E2248DBC10CC75EC1B938107043F0D7679E822203F21E
14789 9977D171B15DD33AD98A925E68F7527488B25CA376EC614BEA4DDF8491E5A9E2
14790 97ED0F5E004AF837EA7C078D708FB02B9C55E908FBB890C5C7222AB1060283C0
14791 C553E5563DA5F894941B64CD9C58BFF9F5EC1BA33391A60E465827E8A0B55336
14792 74B9B039D48C5AC921E2F2AC2B228CAD39241840A431834008E8448ADB78D438
14793 A56AEDE025ABEA630B1D89E5835B0DD4BCEC788BF2934AA97CFBE378C0EA2869
14794 4A1C8C85A9588432E92AAA4B658651C5705B19BB055EBFC65565CAB2143ABDFA
14795 4A737028E3C7DE31E4E520361DF241E2492BC07C084CA309463EB975EE2F7BE1
14796 00150EE39F0EE2074F57C71D65F0BC75A07D0448611C06B2AB6632B61C6213F6
14797 59D4C6BDA43FCFAB7E1BA0303BEAF123EF489F6126A199A07D456273B6AB1037
14798 E85B0310A153EB711DC1FFCC45CC7EA6AEC349A681931AADA4A4CD54D1895C36
14799 5D9B418DAB42E32C9BC594136F94E211DDDA11451304B512A0DA55686EB27B70
14800 D856D3D6F9C16701969CECE3555E3CF563259E6BC35930F7B4EF9C75EDB10FC2
14801 F779901C98FECC06B25E97892E09B979F5FF9C9BFB2F72DF2A0F3C318333382E
14802 A6388B3077A1F86BB8CA5F5108063281861E9A4219339939252194463F90AD6A
14803 52E1E8978A1F6E7DBC86382033CE7E801178FB41FC881A09E33230981984D612
14804 DBB455D062D5A8BA2AD366E93E476563AD2F51D2218D2D2378912B980D623928
14805 358821227C1ACA70B7B388B3E8FE676823FE0926718FD3713C6AE898A0F6EB04
14806 A9D2CB2985041253E32FE8638F1F2033DF4B6179070C904B4AEBD54996706AB5
14807 1991B5906BEFA5B5D6BCCA5F196F28847A0F757821DA85B6724744DB3ED87BEE
14808 605425019F309E87F5743B651538BFEDA3BCD93B468BEF10EC0C46F4BEFBE6E8
14809 35E58A03B7690A98D0887D850F2AA26E37D6D3AF4180565CC2810636D594C609
14810 48FE711ADB30AF5F8DB069FD98201ECD2B58C48B305E53B4517BAB48DED8C324
14811 1F0B4F32ADAC7D618A937D90CCC5891EEA9F03105A483D5A43557F03F4644BF3
14812 1F27E8CF35A20E7F9061138FED81D4E9E0C3E520C772C5DB21BB9E9D6CA09289
14813 60579F6436CEAF49836EEBD6D957F7368EA1DAA2649DE89CC72C79287E82D34E
14814 3EF8C7EA2FA6C18E22DBF3742B6FF2694D34F46001319CBEAA3A49614504C33E
14815 73D671FA1EE0B245E0FB01FB929856BCC95C248257AFCF78B5AD05728787EBF0
14816 64D5A965CF29595BD5A8A00FA4E07E1445827779564F17C7E38B333C7B246AC9
14817 6DC3E56FD28AF18CB636FFEE11D9FA7C05C6DE8312474589418F10A45FDA8715
14818 52D27B17377D335B1CDD913269816341D10663A1B26BD72FDB3CF816719A53EB
14819 BEC0D2F76531BC9E9315D4192E141233CD8933A68BECA3A7C536836ACF5A2EE7
14820 EA03B1B3515C56E24E948DD1A81F988A6DFAF89EA0068B8A00B7FBB65F3C273E
14821 D7CFA73F1590F90DC588808D52E462703F6251F58BB47EC7EA51399E75F2EB6E
14822 9806F3DDB54D82496E3C99591FAD26A91A4CCF5D2513062D97AF34AD932FD6AA
14823 8264C370708D8A50532210658CA60BA8F45DA70D25766949D36653F042DEE328
14824 E9227CD706507E8035D4FF822196FEB29E48A58F615EDCC9947F32A795E0A9E1
14825 4AEFF3ABE0605909792BD183F541EE5B483C22AE9A15CFF16DCC8B88C7865AC6
14826 B86BC41FE30BA0DC23CF2E78D333E885883790F18A87ABB2E339DA3F03FDCA02
14827 E340A35A0C2B62F1C4F4259E6596290A1E7E0BBB5912D6B87175F272E4E3C12C
14828 98166AA4083CAD660AF78EA61BD66B3714B8EE748BF0742EB8512B31AC3E3B33
14829 C3F21E0385055EBC0DFB7682CF489CC6FCBE00A4EF39BB437AA1FFFB75C1502F
14830 623E4865D8458D291FB06025FB4392EF087C1000ADD77D2F2E97A82481E49A6B
14831 96E53FED60C902161853643A2EF56BB682CF20716B559A93FDA0D377450DE257
14832 261D57068B43EF2DEC53B518821A55634B99DD7E5A2E66BB265F68C2389EDCDE
14833 2FBE1C1669B4BA30854D6D0D0CC4A6D1ADC46D04C670733B2C23FCEA76ED5B4D
14834 A1D5D065E0C3D5C01B95731FD3267068482015FAF8929BA836CE401105AAFEF5
14835 943242790378B9DBCE27D9AF179FD6BC16FA9C98F53DB52D5BADC9C6524D9749
14836 867131917FA7EE6FD52921A358CDB75221E9F67C7881FF976C898917A599E09B
14837 53EC91C3371E6C06441FAE21E1F7493976B1051771E7F7C83E4103196BFD11A1
14838 8D1A428A96BF399B7C0E156E755B87C4B93B734C1CA3AC61BB2B539672C411B6
14839 F44B06C1D9FE94D5D954F7112E2D44A3D1EB246A9BD9BCCAB3C31766A5147A5C
14840 FDA08E27C4BFEF9A390F8BA9F81F469362528A78C899C531EFC99AEFD00CC400
14841 AD76F40ACF9023E2C046AB199EE60D222FBC972F7275BA69DCCE0B54A3D3D30D
14842 43AF0EBCFB5D7B0B7F3A707984D64FB088B5D0D4837BBB5F6FB859EA249DEC5C
14843 1C96E50F855EDBC867E6501F47A66733E271B6FA1F8FA0FF13E6CD6149A20189
14844 7CFC194A15D90A41B08C217375B95EC1483E88E094376635CD60F27E1EC9E805
14845 68141268422E83C6E32F7AC88BA4381C9283191C9CD98C4D7B9B7ACEECFE48F0
14846 636EF971DD2D7BDFB527FFEC1C1777EBC3EF465BDA9D08D50986BE365026DAC8
14847 3ADD89BFC13B978749DE9EBFA882BDE41EECDF1DF61284B5F2CB6C40BA049238
14848 72199FA302572EEB1738ABF523892A76DD1DEDCD3C5C8AA13D01309BCABDF299
14849 892BCD7422B724600C7387AB28882E3C7B1404D7D5C8EDED379907A30FE2CE26
14850 2F0C1ED75A204729B4D91C23F4B400E8B0F68ECDFFDF65B4D74A7E487064E8CE
14851 36FB590ED2ADBD67DED04BFE66932B66B6C9149975A5282286E92EB1B2F3A5B7
14852 70504F122868778E8DC4A5D8254A3EEE2EAF443F6E69C007FE1C06C98575E4DD
14853 475BE0910A1F1B271B3AAE6657E094DB56B99A4CDF90354E80E9A8DCCE618765
14854 17087B18C3E2A55530832004C8AA5A9B1F05A63A214EA717A1329DEE785A43A1
14855 B22079BB32C2E9DDBFE06E88EF3E5B91104C7E5AC053A6611BB46B30E7F80D07
14856 73C49196DD8C3630235EE894F413C481A4A323BC5D249C4D41EFC07FB9C4C046
14857 F0EAC23EB789A64FA0742FA6A954D20B08A3157BEDD43A41ABF18681F7C20B5C
14858 0C2A30782F55E907D237ACCDA986550271A75DF6649150F22325CBA4140882B7
14859 F576B024B01960A34028E7E242A6C17EEA153A44CF4C4C0FA45C5EB8C4C985E0
14860 6F606E4F936963E90C7547267FFD6FDA71065263DC2A4D33903E921B80696C5D
14861 EF829CAED4106791AE923AD5A4DD5976431B4F5B3640FEE2BE833E921AFC4028
14862 F57F2976E1A3D16D332E4A490D72647A7E768DF0C0A13EA6C0D7BA7C060CF82F
14863 494A32C40F4B1951C648D1F74FB9412048DB062B65E4CA60035F86019CD5CCFC
14864 7EB064FA0A0E47A5E7ADBC7E4CED66FA569F6E03B6E6741B83744060805DA8C0
14865 DF15C1AE3946453C56E559C22792F4D2A48C7C21E83D0FA04E9AAEBFC0150CC3
14866 33EF5632B9F43E42D726CB1D62F9858653C77B9804BFD52FFB7F1C62E4FF2EEB
14867 A3156D44019448036DC6131B679F1D1E7F9A1234329A8CB90819774D59EECEB0
14868 A008822C15998ABECC299990D5240668CC9947219B6254442EABC51525B75716
14869 320721DCAD60E489D0B55C3E45A65E5FA56599ED8EBA3C780831B62200C8EE61
14870 1FF8F2E20732D8F2126BC2D6D9F7D46C06CB1AAE2FF5F9FF80B56CA89B60B29C
14871 99F7370F70041D73FE8F7B8702BC64841BC9B7B6B205EE08E0E61EB4151D8659
14872 A891FFCDE592DD7BBF124DCD50403920D4CA8DAA5B4FF8D3B95B978379FB7EB5
14873 EE5DD2EFAFC07ACF6340D8F1ECDB1E903A4382BB418528EC373DA439E45BE3B5
14874 FFAA93A60033013658CEBD1FCF91B2B32E639E77BF875D7087C626856388EB91
14875 B40C21808A7396872257014945A7E77E0B0CD2AC3C5D5F8A297A925066A28042
14876 FC738A2DBA2BBF0E35FC96345362A00009293EA02C4BCCDEE4619834FEB40E7C
14877 725C7312BF339F46EBA329460CF598776C017577BAB6DD39BE74551019C4E127
14878 312CC4445DF31F297D07F12D5EAE1D7948E0DB0378AFA69E24CE29EB3DB1CBA4
14879 5D367278E95BE942C1771B1721F4EFFE581424C9C1B47E20FA0A7B6F21811B74
14880 95C1BC9DF17C624EBEFF3CE8FA7DB879F824738B6BE88AC2416447AF69A44F4D
14881 E5338B95073B4229A8406E48024F2A8EC86C95BFC3E9BE221140EA14D6BEAD3A
14882 8171CBAC1D41B43A8F0386D5DF5C73C7B1958D2A5C83C65E512E923C42985A0F
14883 79254F77E797A327685C3D4B9BF76BA43D37737A3A637CB9592932F0C5853E19
14884 CF0F08A1A0A6C249802208755B749AAC9EE1D540A4599C2C811F1ED8DF6911C6
14885 6B8E5F32957A06BEA865F81614B7089D73CAEC6EE3A558A2E0593E472B57D332
14886 4B1FC4A1230F1C5E07AB2D37B72E6CBF5DDB10DF142AE4C039B9982FD72BF46E
14887 47DBA78BEA6C827FE95A81B8D7F818939BA3181FA6C00D84FC2A9D24D1BF1576
14888 BC1C20DD1BE01222D74FD8202F8B19C8F7EAE8528AE33827B3159823501B4DEA
14889 9580E54EF6A59F8EB6DE1D1388DCEF5344AACC55D51812AF347D516A08D0145C
14890 825C78C9C864E667AC49D7E80233940C60A2AE1CC2C70CE7FC98B8C19BDF47AE
14891 CD7A73D7661387BD1898D4C5B0EBD0CA453AD07E13F93391F24B03D79FCD728B
14892 291A12AF5157B9EEB3ABCD9A1D5659EC3CE70D39DD2C4155898A4ED768D10B26
14893 9932DC5AAB4BB0A4C81748D366827F1A5A333268312FE6CFCC959848E5941816
14894 852E2D382C75B51ED8CDD5C08077E51D12241E808B10A3B43C0BEA3EC00A5554
14895 C6E4D0A0B8159DF6E079268D4E29B7FAA8E67D49E194F29351DEE5FE4D089EEF
14896 4FE14D8344F8F9AC480836EF7D426640589F5AB714A12ACBFE5E76CDBBE571AE
14897 F113C748607F7EC0E9DB507F0DDCA82E589B79E97AD8CA40477F32573BD733E0
14898 DEE8A4F5B8B9FD75B37B2A0741A225A740A482371DEEF9CF90680D4F25DB1E93
14899 B81A9634A7CF42562F279E84BBAFDA9162508803FFAA8396C2059E47B038CE37
14900 E5831EA9F6110B5F7919D1A71F4E0E6313E016CE39FA5F6A274994CAE2E54D53
14901 0C74C24991DC79AEB9C37A06947A14F50A8669FCCADC1A42DFE02C0150A5F37E
14902 D36FE65F746BFF51ADCA94A329EDE6EF3FE36AE41141998EA2D07E8CE14C9FF2
14903 C0B8C863156EC1636E573FFF75376588210AA4F0D186FDCA7236C4512B3A1FE9
14904 8449298847290E5A92A510D16F5FF5374BFD8CB5163CA6CD196C017172FC9E00
14905 FE06779F384A198088D8C3447E3C6D3EFEA669B793AD52D5AAD7CDAD1F12ACF0
14906 216B2D085F23A40C1E2D1912C00B6FD0B8F94F33159189005937BAABC36F78A9
14907 20E19C0C1E624A4CD7A8EF41CA5122A36852C62341D5A1054BCD8B21226DF5AE
14908 8CBF05BF06F07C03FFC9834BAD5B7AB0FBB5E01A3599671C1DFDFCEE378073D9
14909 DD0DDF49AC93F2613983FA37D15FA9CFE98CB28550E968467CB2180AB461756C
14910 4F5E8A4A32FE12026A4F66A29D46026886760FDFCA270F1CAB3BED624E3B0186
14911 B4D63BE5BD37AD0D2F38C7B1D4F806FCC4E5539369B34E491E39324BC14C95C4
14912 807AA58E006619AE4D6A3E410BBF112BA75975E481AA5E86B704BA42E806E623
14913 8C39A4E6E965C40F0659D9E1AE82A5410064BB8717F10FFA221A10976B9861E6
14914 81D9A7E3CB843DC05104CE94A68335278F48541EFED12892243A825A167FC91F
14915 C2688632BA024C4C0F01EAE7450F90F4BE84344432F60E7320AEED0B59489C3B
14916 CFB30D87A3BF218A601DFC9A4337A44F0D695DF834956C7787A9706BBFB43EDC
14917 DF27A1EA8BFD930B941213ACC5078429A4AA0CDFFDE0CC8C2F3ACB04E2738204
14918 836FC1648B391515116E6563EDAD359179B36A55DA08CD7E169510940A9B7578
14919 6211045BBFF3989A1841591ADB8D295E4788B4EB80DA5CD892DA734EC628DD81
14920 B041EF6F7F3B60D589217E7EC8D1D19EFE1BC27C989269A118BD87AB0AC5F00F
14921 CEA3016E33F372CAECB95E6CA60D1774E48FAE1593DEA84CAA9A6FF0E073F613
14922 E8C5CD0FF7F092CDD6CBE2D7D57CE103EB4698A8F71892709D640B155D386487
14923 6086D2C2D959F8D0C6DC427DC0A500228D3C4AE52D001E05C65100F73620FC5E
14924 9646094C740B8966A04BF561843A78AF2A9128766072E48BEADF8782CE7032AC
14925 B141704455B72B4BB6096885CD08570375DDAB6238D6CC59FB6CDFE9336F849B
14926 19310C0A93A97E2F142D2EA95C87B57CE863809E36912643F7BA79E5A635833C
14927 4D15DE4DE5FE3A7CF276290101AA79025F960F38798D99F65E0DBF66CDB26DBC
14928 40000030EC1E14DBEE19B4AE9BFCD93F2F9BCADDB3F85F51EFC80FDC10ED8071
14929 E884CB468A97584157D422ECAA97CA287AA786588D63571AE57B1C9A47C51653
14930 FAA26357ECECBD57D99D984882FFF6C169C9A3EE631989E9B71AE0A7D283B3B5
14931 D13A5E99119251BDCC492A24A9AC6CDDFC00D98E345570D75D6D42315A997092
14932 4D537A4B2E5565BE551101CB06C70A4293401C0CE6A08C8D11DBBEAF50DF131A
14933 2B4EEF04A99639761336CB4C6BA39F26DB3B8256839463E1473A417F91886BF2
14934 63A7BAA271B7429BC242ABBF0618E86C9CE91D2E87293390E2ED53ABD99695A2
14935 324A3AE6620224856DDE35FBDA1F2EB430073F69EFE08A44DE081A7A9EA16BD2
14936 0FB5023F64DC265DB823B56C20845C24C0DDA74A29DED7D04C8E2BC54F9D7BA8
14937 715449E60555FAE6DE1C0B9D7BB213724FF2C69F9D30C65CFB76F833FAFC4460
14938 565A4FE09F973DA79B49BBDFD3366CBFCD581994B169A999D5E985970AEE83A4
14939 475CEAF777F167FCAF398AD40B54AC5F434DFBD7BC3634367F8795669F1B752D
14940 2053B3D0781EF75100E4A7B55D10A241B70626C45A3FA14F77BB4340C201F961
14941 680A2C71EEBF9EE42ED4D850D8A6CECE5DAF940421FA781D9AD34F4187EDD858
14942 EF4C4795CF79D6A9BAEF45BA33E6410694CE6F131AF018B6309FFB7C1C459FF3
14943 A535894BEB3868DC84FE0F34F52532A1A111AE3B6C7E2689DF33968A03AD7B86
14944 AC93994CCFECF94544AC9979EBBC94909D6DEEC749414459C10E31A74143EEAF
14945 DA539EDC3D52BF2D678D597B2B23416CBB432AD9AE2DBC988640D4CE2CFC49E0
14946 F3EE13F667B66958B8607BCB4A3CD42FDFA3CDB7B5DD3CA79431C8D57133BE72
14947 4151786678CD5B5D1FB206ED3B0EC11204E3406F19BDA4A1DEF347A3A58F2FDF
14948 B8DF16CC6D1A25A201923458A4CBD572A87DD3836D19A3F25B5C966EE99D0992
14949 C57001EA90FE5B596D4E61F33BEBC14675BC7789D0FCB35C882C661BA38CCED7
14950 3D8B1038F974D988AD1D80938AEE2340AA0294971E32E3308C0C1A373EF51520
14951 DFE0919F4A6D5799A8B95779C86BA8A332A32AB14AC44E77FA87202CCDD29F61
14952 BA291ABB7C0529197AA0700E56578153AC833F4251E0A6FA28D02024F04C7FA5
14953 C3E2B3E1E8FAD7865C7B751E3E946D5E325D6E386634F1391D791A8B29CCFE96
14954 3EFCBF376716ACB7814D3B9B63C7022006370B4F56461B71D2D8FF5D9381936C
14955 B07ECB453EA6CC35184F12BDEB63BB085322956137ECAD6B0AEAF374556FD599
14956 C07882FEDCE56DFFE21B4F484A36591D047F7FA3B451C7FF5B7C37E7C0B29DD4
14957 A3538DBEA4E6E3E7767A9AAC3C8C5CEACC1258E869FF3B2A4226D71C930796AE
14958 78306B5A4FD89A01934A23083F238E72C7709FB8ACC63A0C38E38CC15019F352
14959 5DA9F7A7747E1F3AC1AB75928E0C91AAEB38581CB94FFEFFB2ACCEDD68D9A719
14960 ED5FA28F10A54FF2E189BDCD752086A6CEF84676A658207EDB4BF8BEEA7D5049
14961 BDBA2464D1FF7961431D209B3B76B029DF5019DF1F123CBA71350CAAFABB542C
14962 FF8B50010202425631404CED70B0431D3CA5A4678FD95BAE3BC87DF432813302
14963 BA64E364C2EE7B210074120DC1BCE6086799AAFB97F60008C8FEEF9B8FD45B00
14964 850F2C10ACB669B51AED25CA6D2931A309E2858DD58479CAE6B97B2703C4206C
14965 04B7C5235048667D1454D26B8BE73EAB9DC7B8996EB50CB4393F1CD83C7BE7E5
14966 D75EB726F417AD5BCBABEB283E7CB64D7560EF2FA838FCE8DBB89D7EE989E30A
14967 C245F6E924D719FBF06BAD828414C293BCBD09883E3130C65ACAFB9CCB3D7D2E
14968 B64C89F389183F2CBCDE4BBA7DC221521756DDD4816C6FB88D8E751CABA64328
14969 2E91CE181166327F296E625400760FC5876903F5A50814194E9447DF0FB9C6C5
14970 4A4F0FFFF5A1992D407177ABD609D8EF9EB679AAF16A6915909F2B67CA60FFD4
14971 79F968B801465E37E6C0F5AE2FE329BF83689452E60C3CFED8F475827A252CB8
14972 126230F6ACE477D9C80DA2AE3C4E3D2E01A9DC3B43F572B4A314A089D372DFEE
14973 7D9F8BC1E70E8853B4E8385268600F85CC0EC17EFE464215B619E659834B6DF6
14974 4D1B5101ED2EFC5E8D580C0BFD7CB1A9B500D54F9D078C0A2922682DD82B6D16
14975 796899F819A7F23BC9C8FB47ED25A9ADEDE6AD10F354EA1AEDFCD5382EF5193D
14976 14AF551E7660FEB5DFD13586E5FDC4A441D68D07A04EB1CF214984EF343661D7
14977 DD0F6DCAACC5C78220CFA51F7C41978B1AD434A288E99AD0A094883D453E1780
14978 897348E1E1EFF4470582E82C1B6466CFC8540C069DF75F95C4F4716519A8E12C
14979 6B302E060C81708A108ACBD7FE39FE5B2555753C2D3FE9B61A4A98EAEB075F2C
14980 190AAA3C8E8424378996E7B389612CFB01418D91025BC24BB52FBD3E862F1FFD
14981 1ED821AC347F880CF434F9D47FEFD2A56C1907E4BABBE8999D9FA5B6F03FBDC4
14982 3AA6155FD06F6A90C0F27E9F0CCBB4346A3CA6A7721E8098A231D3A44BD2BE3A
14983 8C677EB452E43D07EF30C49374365A99A1B97687787E0F8B1BBAC018ECBA3745
14984 B46EC288D4E1CC50620F792E63AAFFD5ABB4A5B25BB5BE297DF148A4B445FFB3
14985 F1B20CB27D67C5807A4B583243F43E70D6DD772EDEAEDF89BD895DA329FCDB92
14986 9D9456479A35B34248238B4846DF47472DA7F00C655D4C3AF1ADAD376E72249B
14987 C489E529CE3AE4F0E096C8A45D76B3D874B1393171CB7CCDB785E12C01023FEF
14988 7D5A18FAEC29D302A47BA5B67F97297562BFEECE929781880608A5E06E4F7ADD
14989 A6DCC39BAF56C8C376AE1E9568204D34D6774C46B6CB98D369E4D8ECA34947E3
14990 0E0D17F5A01704F5B99378373371341CED9DECA0D8BD454E25ED440B86FDFD3E
14991 01433F2F6490095BDBB01B5E584B9AE29C03A9637041F699F135009981D98D9A
14992 7B7AC441F71EDD93F2A8666CF42D20DD5939B26A068ABAB4433264ADE5E9BAE8
14993 CD373248E30F6EDA613F93E4671CB0AC98E304CA1D98797E79371E74C8A0CA1F
14994 3269D2164FBF23EB2C418D8DBF7096F017ABA030A54F770EEE3797C07032B887
14995 B914C828ABC6A1E7BA86929B96ACBF8A182A71C095C4263703BD61DBBF94F01C
14996 0EFFBEFC9C8D87B4E5E47F25A089284D0948BE7DBB1829FEDEA85A9371F8B5A0
14997 558630E939A93C9728DAEF0744AB53E6233777A7E164B1EFE1BB6288E2F78708
14998 E4FC46C44D49BA478465615479E5342721CB343062773B8D621B2E081DFB1B21
14999 A18EF7A5064CB0640FE67FEC8798D62F76E7BBC04874842F68C92DA115636581
15000 F274337D31C0A6FFFC0462AC496BB33CDDC1FA62A818B069251A0CE269080F97
15001 C476503D0C78CE61733D002FE7E92823B24742E7D82B72DD97CC6917023CE9CE
15002 A2E67FCD59D81747D6AA7FFD0612A89E241AD33B01FCFDC3A559499781A02B1F
15003 4DE65752F0DE916A96D7AA83E6FBA194BE43CCC1B7CA312B819AA54CFFFA83E8
15004 4F9E953A9CCD06EBD648B95EBC2300146F9D80E0B68DF98A0464D56D7C7D65AD
15005 C6254F7742B0681EF816B6F30E5D231CD72B3D0D16E9D6FCF728A0CB41BF1FD1
15006 25BE76EE9F21801518890B3CC56D0CB4DFB3E0D9B01F141F460B632DFCAB50D8
15007 CE9DB0F1D2CAED39B923980D5930FFA8956A5771E8D325E4F0660D646D18529F
15008 5E9516ECC8AB866364C632C8DC68191E424D1382C870E48FB8659DBD71120E63
15009 EB7CEF33C053251037E689BF66C50A8A282E5DC47D4739F891ED9A62E87168AC
15010 E39794FC8C85280D51FEE1CAA9CA375A4095BCF5858E8DF1B9F9783C9CABEBCB
15011 FF0436199873F1B40C51C1A83684A224B845AB92F0CE98F0B8C891DD2BA9FE7E
15012 A14ADAC936719AB2219EC48872C8700C3F4E48A987EE7096E0BBCAB8D2D1E702
15013 10A4683B9CBE917B0BCDAA87E101237FCD44DD74DAFA32DD5F18E73B32A51D5E
15014 33F0CED9BBF86A457CA84D8765C1A50C446D6B5F243E57512495CD732101ED5D
15015 DD23E0F7E1F94B80188DBB55135A0E5343DC8CA18AD0762214CA100965B9D6FB
15016 CD702A0447BB1EFC9136137E834E0B67B1F1AEDE14027B1A9302325960805A51
15017 3CF3AE7D6E9F30CBEEB1DE7113B024BB248311D141BFF2EA982104A9F80E163B
15018 946EE6AED956CBC6C5A551B40C7BBDDE96E9A15DDFAB3CDB3571CEC172E913B4
15019 202A301D75368073D9DD0DDF49AC93F2613983FA39B2968AFE15463FB70C1A2C
15020 02385E5E728FA1F6E9D30E9BA2F11EC991EC24B2BCA0B6C622075B1BA1CC48DF
15021 B9C229EB4E6279359DB8279056C98F9613193D5AA93BC8576C18C01AC4F1465E
15022 19E597F8F6C074278B1BA93C4BD9DD1A121B81DB3D9E9C9E53EEE7FCB292BCCF
15023 21C75341B990BF48F54C94948BBE3B7EF5B14E4B46FBEC3198CA758EC2FB6B60
15024 92998E8BB21C59825DE138E8A319337DE95A685B0B7528D1BDCF08B3DE2FF46B
15025 BEE88AF827DC4FDEE6E12FF3C51F0E0290DCAFFB86EBE80C17023E1F52279AE3
15026 6F87315D5123A91D30D8C505EF874F28F2910D56F5C5125253A6FA848F43A595
15027 982F07198D43984082737559D293C0E770474533E520003C0CB91921F63BB68D
15028 91BD5C8C11C01DA84D96B20368C421B09BB8FB1B2B9E10E69E06C1F3FF98DA04
15029 1CD83BC8D134C35508240D9E8717F8FE071B617D922CE893FD4B1AFD467B4557
15030 25549EF1A5BF2546132B0D6E642A18E9349655B64375CEB76B0295201847DB1B
15031 8DD9D04CD9FF571BBD073A6AD525D013A346721F648B2856C1E87485D7EB9951
15032 9F544FF2488AD14BAC378CE1123E4620BDA71C0994B1853324909E5601BC801E
15033 3FABFB8ADB167BEE897A226CBC66580D417B503AACDCC92F42216A11F2D202F0
15034 C2BC721D46570B72DBA6FC5C903AEB02223E806A27D13AB23F7861B4BF1D5888
15035 DACBED591D23ABEEBFCAFEA1722D77FF400C7173B57DC4189230B5771E456510
15036 B2AA4A57D7485F201E46DF12BCE5017C451B03920E90ED3E848A07FFF1AA8CDF
15037 97A19BFFBA49A40451BF1B6D1448B1FB2181998509EADEE578D6CA792F4AA58F
15038 D44B4F6EDA309492012D8211676F375782CBDCB2E42C04E3E5A3C48B9CA3558B
15039 104D2B3E010249317312004B92B5D812332F5677E3D47C32A89F942782EC1247
15040 DFDFD88ED3A9B18AB5FAFCA8AB9A67FE4EFA9C8A8D56A035BE9F8F9C31AD68B0
15041 CAA0B2C6FD8D0C446EBEC22EF4462510D829B808E7D62B4197D9A1915A28068B
15042 4E4CBBB11E039B4E52A2EC012EA2ABCB6CC8D7799517A115D3F7DFF7BDA21C92
15043 12688E365FBE5BFBA2578E432EED32A3A747C6D9FF8F2FD46AE89B188BE77E62
15044 720FAF77116B70E913E93851E82A2601FFA0B7ABF80D8F86934715DF1B76F759
15045 C4C44B295C81E72E04427C53E16265AC7505D518981094849F9D218170F2706A
15046 912A7DE583D3552FBADF4ED841FD5E33E68B87627F9B4EFBF79A9A196C4E2C8E
15047 6ED84703BE389DA59DA87A67B2EF7F980858066B58C65AE0ECFB3C38EB4ADEB4
15048 40266A3ECAF6198E83254EC24C14F1E30D80036436F7BAF296CFFA52B6AFD4CD
15049 717A7340AC83605B885C2794ECCDAFA6422E6D4EB2527C6F5D14B09F05FE8D84
15050 05F69C6631D8C42132E28AB2B0E37FBBF3F0DC770C081E874AD94901E7D1914B
15051 D14D4E77965E2751A705D116805B15434A01995E55DE4A57B781D221C2E0C92C
15052 FF820CBC57D9049DA2F2E3DF492EDDDBF4E6D9D5A589C580C5204028E01D0A51
15053 2FDFC13648D4160F9E72B31C78F41DE9262FB83F44DCC5E4055D8CAE3F7FCB8D
15054 A4641501B722EFA74971EB224E5817418D3C54D9BF040C4927DDD5C1C7B1A1D5
15055 348A7F7B9E2383960B460E2867A1E52FB76F3C2A0228DFA2BD4E2891BC09F378
15056 C0C7A3FCE06ED742CD57F2A168E561DB16B3555A11A93164B747B1CA7586D2EB
15057 D03EF6D5F125F6004E7E1FBD9B851F1CABB38379F6E44B0B3748B0FB4D394246
15058 05A208F141480A12047880155F806B4D271DA103E9085A13FA71EAB16710E466
15059 94D9C63519004233F9E490FEAD6C3638FA955A6A6A4810A88B1399815AF58520
15060 E7FFC694557F6B9C3507A22498265CDA41352B9047D65076D02F1BC8D04C6C84
15061 19FFF29DD5601C60A4E1DE954C1A385FB91E2CCEA174CCCD6076933119E9BF7C
15062 2E02379FE957C6A11C5C877AB543FBABB002006F5CF957CDC1BA2DCBDD016515
15063 A4694A704C11F848210ED18D4AECD4AB6F4B7CBDB017B74CEE5A2CC77D053049
15064 A1448BD7CAB5C3A53E5E1F2038084784571A69DF73908644F100F6499DB88CFB
15065 012A3F2D3EC433CF4C713EF80D3689FDC8ED8B739E7EDAF7E592EACC13B8BB5B
15066 ABE116C42F784B7015A7FBE5B8AA8EA93877E640925DC731A168BAE6B5D63629
15067 F7123FFB32427321CD8934546A99B27E5BFF84DEBA473CAD8CEE4553F98535C4
15068 937436A554B647153B14C0D3655051925B4F29F9B4F6A29049FFE25B53A401AD
15069 66ABDF9858D8314196F7B2334510E97FDF024A07CD964F5A3ABFD6EBB54C1933
15070 361AD8EA93B75B8DEAB2FF6F81145BC94272F384345EDB09788582EAEDEC906F
15071 EC7EC110DABC82DD7A789EA1FC80D691A0859ED07007855B478A2607278973E8
15072 52EF390F343CC072587E0BF4513D54AF951416B89EF0A04E522C1E0374FFBE1F
15073 030906581A858CBEFDD9D9057BEAB07A03E3739A2758E183C159F24F2B7F2C9B
15074 2C21EEFB7435F393E960A1388E0C90F2341AEA86F43BFDDBBF838209C278E0FA
15075 51A8DC8D0CCE8BDE7C61F639430ABC9FF231474EC572987693322F48C97DF1E7
15076 9C401DF86EC8B45F28B6457AACCBF4378590D6DF397573922F2718DE716237E6
15077 357984D6091A663521592F41B7176795E6BD9B40B284AF522D1AD7F9A9F03DE9
15078 3F129468A4164043E1045DF8996DC073CDD4ADE95C24E7D98D1893C2AEC9FDF0
15079 13228F7FAA9A4DAF7FFE8EFF0FE716845EA9BBD9265E36E8CC3C00D18BDF7222
15080 9385555F7AA6ECF39399CC8D3CCFA651735F48F18821860811D967B93BBC129C
15081 8F485D414AEBA3F80924223163D8682C7108D284324AD8DB3DE6C1AFF44BC35C
15082 13744F3B332FF3ED943E56D6DB9116F905FD270F9B0F9D334037A6CD22572AE4
15083 60D60BC6DA913D9B3C9EC922B3474149050E36C5A585B2BFF6F2EE6D0D43A93F
15084 55A99D4D9F68D6E89C5945A0D9FC9C5BDD9403476D09FFD687079BA3908BAA06
15085 CFF9D9DDB15F0EA586BB9D6403A447F0564B2F09B75FC9E354179AE3E6FA37AF
15086 7F580925F2AF9C2E1B1A83B3CA0B964A50DE907D129E6D344189A3E8CAC8F3AF
15087 D3C5A028745385FC7A0491A8C05A6392A2038AB5A145DF07A2A54E10F68F418D
15088 B655AB07FA98141F49ACB4BD29A3CB9587671BFB427A13352BF673FAABBDD02F
15089 DDC957FCDE3AB3A4ADBB84A6BA5104F5C6CF919DCED24CE2D94DB28C25F7B90D
15090 CD6CB0713730119066ED504CAD205D1733191DADDA166A380D893D2552F40F0E
15091 AEF28FFDEFD5742A3C17287558A12C0A930E2BE5EEDF439F57D643BCA5739D19
15092 4E73A7C1C50E89A1EEAF24D1350AE1F505011EC681FDDE8581C76DD8D5C5AE28
15093 CA5596228334333F672F778B37789212B258CD95F07F49A21E19AB79F3D1BC28
15094 FF92A7CC90F8EB2B5D60ACE8C6CF13C901C509C92ECAC8146F8A9B91C23555DB
15095 6564E80E08F5815C28CF76DA7815F53F759BDE8AD93E427A9D7083532AA7D4BB
15096 6FAD7833CE962DBA314D627C63DCEA9432BDADEF6BB9603D1D9FEB6CB5EFE591
15097 8F577BDCB69C4A0F8DFC402077820540F84413F301ED7B163C4C6E8A69AF7C9D
15098 A61041C2376D1250E6B7985356E9ED72BCC5FFA3DD0CFCE0739BCAB0A52D9480
15099 66559D94FABE3CB6776F55162EF4C46C2AF9B73F5363EEDFB3DC5B0237CBF8FE
15100 3947FBDB1647B595451095E7CCAB73A47B87C36277AE82180E509CC50F59A62F
15101 49AD4DF391196F4E4A737C7B59A3E243E26DDCB83B18B27DD5D40B605F699BD0
15102 2ACCFD4C13D6DA9A020C170948DB2521A91ACA819A8D45B0E414EC4A640EB4DE
15103 AB14B2D0E667E52C8AC0FE320CA0696B1828DE40C438DD8EF92BE1EFE1E83E11
15104 AB8E0CB83321DE45D0B3614AAA17CE9384F5BF918EC6D2625026F7C36B61ACC2
15105 1855CA70A6416B779DC2EB52ADE7D53AA474DB9D6D8A
15106 0000000000000000000000000000000000000000000000000000000000000000
15107 0000000000000000000000000000000000000000000000000000000000000000
15108 0000000000000000000000000000000000000000000000000000000000000000
15109 0000000000000000000000000000000000000000000000000000000000000000
15110 0000000000000000000000000000000000000000000000000000000000000000
15111 0000000000000000000000000000000000000000000000000000000000000000
15112 0000000000000000000000000000000000000000000000000000000000000000
15113 0000000000000000000000000000000000000000000000000000000000000000
15116 TeXDict begin 39158280 55380996 1000 600 600 (test_04.dvi)
15117 @start /Fa 205[42 42 49[{T1Encoding ReEncodeFont}2 83.022
15118 /SFRM1000 rf /Fb 22[60 114[69 73 51 52 53 1[73 66 3[69
15119 40 37 73 2[60 73 58 73 66 12[91 73 2[90 29[66 66 20[73
15120 28[{T1Encoding ReEncodeFont}23 119.552 /SFBX1440 rf /Fc
15121 134[51 3[54 8[27 33[50 17[49 4[49 49 49 49 3[27 44[{
15122 T1Encoding ReEncodeFont}10 99.6264 /SFRM1200 rf /Fd 139[52
15123 53 13[60 16[97 25[37 58[{T1Encoding ReEncodeFont}5 143.462
15124 /SFRM1728 rf /Fe 139[72 72 2[72 72 2[72 2[72 3[72 72
15125 48[72 5[72 45[{T1Encoding ReEncodeFont}10 143.462 /SFTT1728
15129 %%Feature: *Resolution 600dpi
15131 %%BeginPaperSize: a4
15132 /setpagedevice where
15133 { pop << /PageSize [595 842] >> setpagedevice }
15134 { /a4 where { pop a4 } if }
15140 TeXDict begin 1 0 bop 0 TeXcolorgray Black 0 TeXcolorgray
15141 0 TeXcolorgray 0 TeXcolorgray 1371 304 a Fe(pst-solides3d)45
15142 b Fd(:)1755 487 y(T)-11 b(est)1597 922 y Fc(July)33 b(13,)f(2008)144
15143 1280 y Fb(1)131 b(T)-11 b(est)44 b(\351criture)h(de)e(\034c)l(hier)i
15144 (ob)7 b(j)44 b(a)l(v)l(ec)h(jps)p 0 TeXcolorgray 0 TeXcolorgray
15146 tx@Dict begin CM STV CP T newpath /a 0.0 def /w 312.98018 a add def
15147 /d 0.0 a add neg def /h 369.88567 a add def a neg d moveto a neg h
15148 L w h L w d L closepath clip newpath 0 0 moveto setmatrix end
15149 581 4464 a 1762 3520 a @beginspecial @setspecial
15150 tx@Dict begin STP newpath 0.8 SLW 0 setgray 0. true -142.26372
15151 -113.81097 170.71646 256.07469 .5 Frame gsave 0.8 SLW 0 setgray
15152 1. .setopacityalpha 0 setlinecap stroke grestore end
15155 @endspecial @beginspecial @setspecial
15156 tx@Dict begin STP newpath 0.8 SLW 0 setgray 1 setlinejoin /pst@fill
15157 { 1. .setopacityalpha fill } def /strokeopacity 1. def /fillopacity
15158 1. def /xunit {28.45274 } def /decal -2 def /viewpointXYZ {50 -20 30
15159 rtp2xyz} def /Decran 50 def /RotX 0 def /RotY 0 def /RotZ 0 def /fontsize
15160 {10 28.45274 mul 28.45 div } bind def /projectionsifacevisible true
15161 def /R 4 def /r1 4 def /r0 1.5 def /resolution 36 def /phi 0 def /theta
15162 90 def /r 2 def /a 4 def /b a def /c a def /h 6 def /trunccoeff .25
15163 def /chanfreincoeff .8 def /affinagecoeff .8 def /dualregcoeff 1 def
15164 /solidintersectiontype -1 def /section {R h 2 div neg R h 2 div r h
15165 2 div r h 2 div neg } def /base [ -1 -1 1 -1 0 1] def /solidintersectionlinewidth
15166 [ 1] def /solidintersectioncolor [ (rouge)] def /solidintersectionplan
15167 [ [0 0 1 0]] def /axe { 0 0 1} def /plansection [ ] def /definition
15168 () def /args { } def /Mode 2 def /lightintensity 2 def /solidlinewidth
15169 {0.8 } def /linecolor {0 setgray } def /linestyle {solid} def /fillcolor
15170 {1 setgray currentrgbcolor} def /fillincolor {0 1 0 setrgbcolor currentrgbcolor}
15171 def /color1 {1 0 0 0 setcmykcolor } def /color2 {0 1 0 0 setcmykcolor
15172 } def /color3 {0 0 1 setrgbcolor } def /color4 {1 0 0 setrgbcolor
15173 } def /range [ -5 5] def /action (draw**) def /texte () def /pos (cc)
15174 def /proj-fontsize {10 28.45274 mul 28.45 div } bind def /lightsrc
15175 {10 0 10} def /rmfaces [] def /fcol [] def /solidhue [] def /solidinouthue
15176 [] def /solidinhue [] def /origin {0 0 0} def /sommets [] def /faces
15177 [] def /solidshow [] def /solidnum [] def /solidnumf [] def /solidtrunc
15178 [] def /solidaffinage [] def /ngrid [] def /affinagerm true def /chanfrein
15179 false def /solidgrid true def /solidplanmarks false def /solidplangrid
15180 false def /solidshowbase3d false def /activationgestioncouleurs true
15181 def /solidshowbase false def /soliddualreg false def /solidgeode false
15182 def /solidhollow false def /solidbiface true def viewpointXYZ /ZpointVue
15183 ED /YpointVue ED /XpointVue ED /THETA {YpointVue XpointVue atan} bind
15184 def /PHI {ZpointVue XpointVue dup mul YpointVue dup mul add sqrt atan}
15185 bind def /Dobs {XpointVue dup mul YpointVue dup mul add ZpointVue dup
15186 mul add sqrt} bind def XpointVue YpointVue ZpointVue /viewpoint defpoint3d
15187 SolidesDict begin 0 0 0 /CZ exch def /CY exch def /CX exch def 3
15188 newcube dup (jaune) outputcolors (cube) writeobjfile end gsave 0.8
15189 SLW 0 setgray 1. .setopacityalpha 0 setlinecap stroke grestore
15194 currentpoint initclip moveto
15195 3180 4464 a 0 TeXcolorgray 1860 6074 a Fa(1)p
15196 0 TeXcolorgray eop end
15198 TeXDict begin 2 1 bop 0 TeXcolorgray 0 TeXcolorgray 0
15199 TeXcolorgray 144 -45 a Fb(2)131 b(T)-11 b(est)44 b(\351criture)h(de)e
15200 (\034c)l(hier)i(ob)7 b(j)44 b(a)l(v)l(ec)h(PST)-11 b(ric)l(ks)p
15201 0 TeXcolorgray 0 TeXcolorgray 581 3140 a
15202 tx@Dict begin CM STV CP T newpath /a 0.0 def /w 312.98018 a add def
15203 /d 0.0 a add neg def /h 369.88567 a add def a neg d moveto a neg h
15204 L w h L w d L closepath clip newpath 0 0 moveto setmatrix end
15206 2195 a @beginspecial @setspecial
15207 tx@Dict begin STP newpath 0.8 SLW 0 setgray 0. true -142.26372
15208 -113.81097 170.71646 256.07469 .5 Frame gsave 0.8 SLW 0 setgray
15209 1. .setopacityalpha 0 setlinecap stroke grestore end
15211 @endspecial @beginspecial
15213 tx@Dict begin STP newpath 0.8 SLW 0 setgray 1 setlinejoin /pst@fill
15214 { 1. .setopacityalpha fill } def /strokeopacity 1. def /fillopacity
15215 1. def /xunit {28.45274 } def /decal -2 def /viewpointXYZ {50 -20 30
15216 rtp2xyz} def /Decran 50 def /RotX 0 def /RotY 0 def /RotZ 0 def /fontsize
15217 {10 28.45274 mul 28.45 div } bind def /projectionsifacevisible true
15218 def /R 4 def /r1 4 def /r0 1.5 def /resolution 36 def /phi 0 def /theta
15219 90 def /r 2 def /a 4 def /b a def /c a def /h 6 def /trunccoeff .25
15220 def /chanfreincoeff .8 def /affinagecoeff .8 def /dualregcoeff 1 def
15221 /solidintersectiontype -1 def /section {R h 2 div neg R h 2 div r h
15222 2 div r h 2 div neg } def /base [ -1 -1 1 -1 0 1] def /solidintersectionlinewidth
15223 [ 1] def /solidintersectioncolor [ (rouge)] def /solidintersectionplan
15224 [ [0 0 1 0]] def /axe { 0 0 1} def /plansection [ ] def /definition
15225 () def /args { } def /Mode 2 def /lightintensity 2 def /solidlinewidth
15226 {0.8 } def /linecolor {0 setgray } def /linestyle {solid} def /fillcolor
15227 {1 setgray currentrgbcolor} def /fillincolor {0 1 0 setrgbcolor currentrgbcolor}
15228 def /color1 {1 0 0 0 setcmykcolor } def /color2 {0 1 0 0 setcmykcolor
15229 } def /color3 {0 0 1 setrgbcolor } def /color4 {1 0 0 setrgbcolor
15230 } def /range [ -5 5] def /action (writeobj) def /texte () def /pos
15231 (cc) def /proj-fontsize {10 28.45274 mul 28.45 div } bind def /lightsrc
15232 {10 0 10} def /rmfaces [] def /solidfilename (test) def /fcol [] def
15233 /solidhue [] def /solidinouthue [] def /solidinhue [] def /origin {0
15234 0 0} def /sommets [] def /faces [] def /solidshow [] def /solidnum
15235 [] def /solidnumf [] def /solidtrunc [] def /solidaffinage [] def /ngrid
15236 [] def /affinagerm true def /chanfrein false def /solidgrid true def
15237 /solidplanmarks false def /solidplangrid false def /solidshowbase3d
15238 false def /activationgestioncouleurs true def /solidshowbase false
15239 def /soliddualreg false def /solidgeode false def /solidhollow false
15240 def /solidbiface true def viewpointXYZ /ZpointVue ED /YpointVue ED
15241 /XpointVue ED /THETA {YpointVue XpointVue atan} bind def /PHI {ZpointVue
15242 XpointVue dup mul YpointVue dup mul add sqrt atan} bind def /Dobs {XpointVue
15243 dup mul YpointVue dup mul add ZpointVue dup mul add sqrt} bind def
15244 XpointVue YpointVue ZpointVue /viewpoint defpoint3d SolidesDict begin
15245 0. 0. 0. /CZ exch def /CY exch def /CX exch def pst-cube end gsave
15246 0.8 SLW 0 setgray 1. .setopacityalpha 0 setlinecap stroke grestore
15249 @endspecial 3180 3140 a
15250 currentpoint initclip moveto
15251 3180 3140 a 0 TeXcolorgray
15252 1860 6074 a Fa(2)p 0 TeXcolorgray eop end
15255 userdict /end-hook known{end-hook}if